poj 1390 Blocks

来源:互联网 发布:ubuntu 微信 编辑:程序博客网 时间:2024/05/22 03:18

题意:

给一行有颜色的方块,相同颜色且相邻的方块可以消去并得到(该颜色长度)^2的分数,消去一些方块后剩余方块会自动靠拢,求消去所有方块的最高分数。

分析:

黑书上的例题,类似区间dp一般是dp[i][j]表示区间状态(i,j)能取到的最优值,这题用dp[i][j][k],这个k看似与最优值没啥关系。。仔细一想却很巧妙,他假设之后会有k个与第j段颜色相同的方块一起消,这样在后面某段的计算需要和前面一起消时就能直接调用结果了。

代码:

//poj 1390//sep9#include <iostream>using namespace std;const int maxN=205;int dp[maxN][maxN][maxN];int color[maxN],len[maxN];int n;void search(int i,int j,int k){if(dp[i][j][k]) return ;if(i==j){dp[i][j][k]=(len[i]+k)*(len[i]+k);return ;}if(i>j) return ;search(i,j-1,0);dp[i][j][k]=dp[i][j-1][0]+(len[j]+k)*(len[j]+k);for(int x=i;x<j;++x){if(color[x]!=color[j]) continue;search(i,x,k+len[j]);search(x+1,j-1,0);dp[i][j][k]=max(dp[i][j][k],dp[i][x][k+len[j]]+dp[x+1][j-1][0]);}return ;}int main(){int i,x,p,cases,t=0;scanf("%d",&cases);while(cases--){scanf("%d",&n);color[0]=INT_MIN;for(p=0,i=1;i<=n;++i){scanf("%d",&x);if(x!=color[p]){++p;color[p]=x;len[p]=1;}else++len[p];}memset(dp,0,sizeof(dp));search(1,p,0);printf("Case %d: %d\n",++t,dp[1][p][0]);}return 0;} 


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿上火怎么办吃什么可以去火 肚子胀怎么办最快的方法 40天婴儿拉水怎么办 8个月宝宝坐不稳怎么办 宝宝段奶不吃奶粉怎么办 3个月宝宝头睡偏了怎么办 2个月婴儿抱着睡怎么办 两个半月的宝宝睡眠少怎么办 七个月宝宝不愿意坐怎么办 一个多月的宝宝老是哭闹怎么办 宝宝头老往后仰怎么办 8个月宝宝不会爬怎么办 孩子个头长得慢怎么办 宝宝个头长得慢怎么办 婴儿个头长得慢怎么办 11个月宝宝认生怎么办 3个月宝宝认人怎么办 3个月的宝宝认生怎么办 两个月的宝宝睡觉一惊一惊怎么办 六个月宝宝不喜欢喝水怎么办 三岁宝宝尿多怎么办 一岁的宝宝尿少怎么办 一岁宝宝尿黄怎么办 三岁宝宝尿黄怎么办 5个月宝宝认生怎么办 3岁宝宝怕生胆小怎么办 2岁宝宝怕生胆小怎么办 1岁半宝宝认生怎么办 宝宝认人一直哭怎么办 七个月宝宝认人怎么办 一个月宝宝认人怎么办 2个多月宝宝认人怎么办 婴儿认人一直哭怎么办 六个月宝宝认人怎么办 十一个月宝宝断奶后辅食怎么办 6个月宝宝不会坐怎么办 7个月宝宝坐不住怎么办 三个月宝宝白天闹觉怎么办 3个月宝宝不追声怎么办 一岁宝宝垃肚子怎么办 新生儿四天没大便怎么办老放屁