原题链接:
题意:
消消乐,可以把数组中相邻的字母删掉,问最少要消多少次。
解法:
二维DP。
表示删除 i ~ j 的最少操作数
转移方程:
Code :
# include <bits/stdc++.h>
//# define int long long
# define pb push_back
# define db double
using namespace std;
int n, f[505][505], inf = 1e6;
// f_{i, j}:把 i ~ j 全删了的最小代价
char s[505];
int main(){
for (int i = 0;i <= 501;i++) for (int j = 0;j <= 501;j++) f[i][j] = inf;
scanf("%d%s", &n, s+1);
for (int i = 1;i <= n;i++) f[i][i] = 1;
for (int i = 2;i <= n;i++){
for (int l = 1;l <= n;l++){
int r = l+i-1;
if (r > n) break;
for (int j = l;j < r;j++){
f[l][r] = min(f[l][r], f[l][j] + f[j+1][r]);
}
f[l][r] -= (s[l] == s[r]);
}
}
cout << f[1][n];
return 0;
}