题意:给出一个字符串S,|S|<=500。每次操作可以删除一段连续的相同字母的子串。问,最少操作多少次可以把这个字符串变成空串。
分析:刚开始的思路是,把连续的串给删除掉,然后再。。。。贪心。完全没想到这个题目会是用区间dp来做,惭愧。。。
虽然后来知道是区间dp,但是想了很久也没想到如何dp。最后看了别人的博客,dp确实有点神奇。
$m imes 10^{k_{1}-1}$
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=505;
int dp[maxn][maxn];
char word[maxn];
int main()
{
int n;
scanf("%d",&n);
scanf("%s",word+1);
for(int len=1;len<=n;len++)
{
for(int l=1;len+l-1<=n;l++)
{
int r=len+l-1;
if(word[r]==word[l])
dp[l][r]=dp[l+1][r-1]+1;
else
dp[l][r]=min(dp[l+1][r],dp[l][r-1])+1;
for(int k=l+1;k<=r-1;k++)
dp[l][r]=min(dp[l][k]+dp[k][r]-1,dp[l][r]);
}
}
printf("%d
",dp[1][n]);
return 0;
}