题意:给出一个字符串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; }