eduCF#61 F. Clear the String /// 区间DP 消除连续一段相同字符 全部消完的最少次数

题目大意:

给定字符串 每次消除可消除连续的一段相同的字符的子串

求消除整个字符串的最少消除次数

 

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int N=500+5;

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

int main()
{
    while(~scanf("%d%s",&n,s)) {
        inc(i,0,n-1) dp[i][i]=1;
        inc(i,0,n-1) inc(j,0,i-1) {
            dp[j][i]=INF;
            inc(k,j,i-1) {
                // 如 “abaca”
                int t=dp[j][k]+dp[k+1][i-1];
                //     “aba”  +  “c” 
                if(s[k]!=s[i]) t++;
                // 此时s[k]='a'=s[i] 故先消“c”使得“aba”并上s[i]
                // 那么s[i]就不需要重新再消一次 
                dp[j][i]=min(t,dp[j][i]);
            }
        }
        printf("%d\n",dp[0][n-1]);
    }

    return 0;
}

 

posted @ 2019-03-06 14:09  _Jessie  阅读(478)  评论(0编辑  收藏  举报