BZOJ 1260 涂色
题目分析:可以看出这是一道区间DP,然后按照
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int f[100][100];
char s[100];
int main(){
int len=strlen(gets(s+1));
memset(f,0x3f,sizeof(f));
for(int i=1;i<=len;++i) f[i][i]=1;
for(int l=2;l<=len;l++)
for(int i=1;i+l-1<=len;i++){
int j=i+l-1;
if(s[i]==s[j]){
f[i][j]=min(f[i][j],f[i+1][j-1]+1);//这一次涂的颜色跟上一次的不一样,所以由上一次的+1
f[i][j]=min(f[i+1][j],f[i][j-1]);//这一次要涂的颜色和左右两个跟新过来的是一样的,就不用加
}//上面两个都取最小值
else for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);//这里是区间DP的典型做法,小区间跟新大区间
}
printf("%d",f[1][len]);
return 0;
}