BZOJ 1032 [JSOI2007]祖码Zuma
2016-09-27 14:03
267 查看
区间DP
发现对于连续的相同颜色个数,我们只关心它大于1还是等于1,于是可以把相同颜色的块合起来,记一个size。
注意到一个区间[i,j]的消除有两种情况。一是先消除[i,k]再消除[k+1,j],二是消除了[i+1,j-1]之后剩下两边的一样恰好消掉。
记f[i][j]表示区间[i,j]全消除需要的最小代价,就可以DP了
发现对于连续的相同颜色个数,我们只关心它大于1还是等于1,于是可以把相同颜色的块合起来,记一个size。
注意到一个区间[i,j]的消除有两种情况。一是先消除[i,k]再消除[k+1,j],二是消除了[i+1,j-1]之后剩下两边的一样恰好消掉。
记f[i][j]表示区间[i,j]全消除需要的最小代价,就可以DP了
#include<cstdio> #include<cstring> #include<algorithm> #define N 505 using namespace std; int col[N], siz[N], f[N][N]; int main() { int n, m=0; scanf("%d",&n); col[0]=-1; for(int i = 1, x; i <= n; i++) { scanf("%d", &x); if(col[m]!=x) col[++m]=x; siz[m]++; } memset(f,63,sizeof(f)); for(int i = 1; i <= m; i++) { f[i][i]=(siz[i]==1?2:1); f[i][i-1] = 0; } for(int d = 1; d < m; d++) { for(int i = 1; i+d <= m; i++) { int j = i+d; for(int k = i; k < j; k++) f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]); if(col[i]==col[j]) f[i][j]=min(f[i][j],f[i+1][j-1]+(siz[i]+siz[j]>2?0:1)); } } printf("%d\n",f[1][m]); return 0; }
相关文章推荐
- Bzoj1032 [JSOI2007]祖码Zuma
- BZOJ 1032 JSOI2007 祖码Zuma 动态规划
- BZOJ 1032 [JSOI2007] 祖码Zuma
- BZOJ 1032 JSOI 2007 祖码Zuma 区间DP
- BZOJ 1032 [JSOI2007]祖码Zuma
- [bzoj1032][JSOI2007]祖码Zuma【区间dp】
- BZOJ 1032 JSOI 2007 祖码Zuma 区间DP
- bzoj 1032: [JSOI2007]祖码Zuma(区间DP)
- [BZOJ1032][JSOI2007]祖码Zuma 区间dp
- BZOJ 1032 JSOI2007 祖码Zuma 动态规划
- bzoj千题计划120:bzoj1032[JSOI2007]祖码Zuma
- bzoj1032: [JSOI2007]祖码Zuma
- BZOJ 1032: [JSOI2007]祖码Zuma 区间DP
- bzoj1032 [JSOI2007]祖码Zuma
- BZOJ-1032: [JSOI2007]祖码Zuma
- 【BZOJ 1032】 [JSOI2007]祖码Zuma
- BZOJ.1032.[JSOI2007]祖码(区间DP)
- bzoj1032 [JSOI2007]祖码Zuma DP
- [JSOI2007]祖码Zuma/[bzoj]1032
- [BZOJ 1032][JSOI 2007]祖玛 题解(区间DP)