luogu P4170 [CQOI2007]涂色

题目描述

假设你有一条长度为5的木版,初始时没有涂过任何颜色。你希望把它的5个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为5的字符串表示这个目标:RGBGR。

每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。

用尽量少的涂色次数达到目标。

输入格式

输入仅一行,包含一个长度为n的字符串,即涂色目标。字符串中的每个字符都是一个大写字母,不同的字母代表不同颜色,相同的字母代表相同颜色。

输出格式

仅一行,包含一个数,即最少的涂色次数。

说明/提示

40%的数据满足:1<=n<=10

100%的数据满足:1<=n<=50


区间动态规划

如果边界相同,那么可以看成多划了一笔

然后就是断开考虑

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=55;
int a[N],n;
int f[N][N];
int main(){
    char c;
    while(1){
        c=getchar();
        if(c=='\n')break;
        a[++n]=c-'A'+1;
    }
    memset(f,0x7f,sizeof(f));
    for(int i=1;i<=n;i++)f[i][i]=1;
        
    for(int len=2;len<=n;len++)
    for(int l=1;l+len-1<=n;l++){
        int r=len+l-1;
        if(a[l]==a[r])
        f[l][r]=min(f[l+1][r],f[l][r-1]);
        for(int k=l;k<r;k++)
        f[l][r]=min(f[l][k]+f[k+1][r],f[l][r]);
    }
    cout<<f[1][n]<<endl;
}

猜你喜欢

转载自www.cnblogs.com/naruto-mzx/p/11656830.html