bzoj1260: [CQOI2007]涂色paint
裸的区间DP。。(听说模版)
我能说n那么小让我很慌吗。。。
如果最左最右相等,那就相当于涂左顺便涂右。
f[i][j]=min(min(f[i+1][j],f[i][j-1]),f[i+1][j-1]+1);
然后枚举断点咯。
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; char ss[110]; int f[110][110]; int main() { scanf("%s",ss+1);int n=strlen(ss+1); for(int i=1;i<=n;i++)f[i][i]=1; for(int L=2;L<=n;L++) { for(int i=1;i+L-1<=n;i++) { int j=i+L-1; f[i][j]=2147483647; if(ss[i]==ss[j])f[i][j]=min(min(f[i+1][j],f[i][j-1]),f[i+1][j-1]+1); for(int k=i;k<j;k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); } } printf("%d\n",f[1][n]); return 0; }
pain and happy in the cruel world.