首页 > 其他 > 详细

eduCF#61 D. Magic Gems /// 区间DP

时间:2019-03-06 14:40:51      阅读:132      评论:0      收藏:0      [点我收藏+]

题目大意:

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

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

 

#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;
}

 

eduCF#61 D. Magic Gems /// 区间DP

原文:https://www.cnblogs.com/zquzjx/p/10482912.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!