给你一个串 \(s\),每次可以花费 \(1\) 的代价删去一个子串,要求子串的每一位为同一个字符。求删去整个串的最小代价。\(1\le |s|\le 500\)

Solution

\(f[i][j]\) 表示删除子串 \([i,j]\) 的最小花费,则

\[f[i][j]=\min (f[i][j],f[i][k]+f[k+1][j]+1-[s[k]=s[j]]) \]

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 505;

char s[N];
int n,f[N][N];

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>s+1;
    memset(f,0x3f,sizeof f);
    for(int i=1;i<=n;i++) f[i][i]=0;
    for(int l=1;l<n;l++) {
        for(int i=1;i+l<=n;i++) {
            int j=i+l;
            for(int k=i;k<j;k++) {
                f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+1-(s[k]==s[j]));
            }
        }
    }
    cout<<f[1][n]+1;
}

相关文章:

  • 2021-08-08
  • 2021-12-24
  • 2021-08-27
  • 2021-10-12
  • 2022-12-23
  • 2022-12-23
  • 2021-09-11
  • 2022-12-23
猜你喜欢
  • 2021-07-18
  • 2022-01-17
  • 2021-04-21
  • 2022-12-23
  • 2022-02-17
  • 2022-02-07
  • 2022-12-23
相关资源
相似解决方案