codeforces#1132 F. Clear the String(神奇的区间dp)

题意:给出一个字符串S,|S|<=500。每次操作可以删除一段连续的相同字母的子串。问,最少操作多少次可以把这个字符串变成空串。

分析:刚开始的思路是,把连续的串给删除掉,然后再。。。。贪心。完全没想到这个题目会是用区间dp来做,惭愧。。。

虽然后来知道是区间dp,但是想了很久也没想到如何dp。最后看了别人的博客,dp确实有点神奇。

 

 

$m\times 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\n",dp[1][n]);
    return 0;
}

  

 

posted @ 2019-03-11 19:15  czh~  阅读(269)  评论(0编辑  收藏  举报