POJ 1390 Blocks DP *
来源:互联网 发布:淘宝开学季文案 编辑:程序博客网 时间:2024/06/05 23:50
题目地址:http://poj.org/problem?id=1390
click_box(i,j,ex_len)
表示:
大块j的右边已经有一个长度为ex_len的大块(该大块可能是在合
并过程中形成的,不妨就称其为ex_len),且j的颜色和ex_len
相同,在此情况下将 i 到j以及ex_len都消除所能得到的最高分
。
于是整个问题就是求:click_box(0,n-1,0)
求click_box(i,j,ex_len)时,有两种处理方法,取最优者
假设j和ex_len合并后的大块称作 Q
1) 将Q直接消除,这种做法能得到的最高分就是:
click_box(i,j-1,0) + (len[j]+ex_len)
2
2) 期待Q以后能和左边的某个同色大块合并。需要枚举可能和Q
合并的大块。假设让大块k和Q合并,则此时能得到的最大
分数是:
click_box(i,k,len[j]+ex_len) + click_box(k+1,j-1,0)
click_box(i,j,ex_len) 递归的终止条件:i == j
#include<iostream>#include<cstdio>#include<vector>#include<cstring>#include<algorithm>using namespace std;const int maxn=200+5;int color[maxn],blen[maxn];int sorce[maxn][maxn][maxn];int ClickBox(int i,int j,int len){int& ans=sorce[i][j][len];if(ans!=-1) return ans;ans=(blen[j]+len)*(blen[j]+len);if(i==j) return ans;ans+=ClickBox(i,j-1,0);for(int k=i;k<j;k++)if(color[k]==color[j])ans=max(ans,ClickBox(i,k,blen[j]+len)+ClickBox(k+1,j-1,0));return ans;}int main(){int T;cin>>T;for(int t=1;t<=T;t++){int n,bNum=-1;cin>>n;memset(sorce,-1,sizeof(sorce));int last=0;for(int i=0;i<n;i++){int c;cin>>c;if(last!=c){bNum++;blen[bNum]=1;color[bNum]=c;last=c;}else blen[bNum]++;}printf("Case %d: %d\n",t,ClickBox(0,bNum,0));}return 0;}
0 0
- poj 1390 Blocks(dp)
- POJ 1390 Blocks dp
- poj 1390 Blocks(DP)
- Blocks - POJ 1390 dp
- POJ 1390 Blocks(DP)
- POJ 1390 Blocks DP *
- POJ 1390 Blocks (DP)
- poj 1390 Blocks 【区间dp】
- Uva 10559 & POJ 1390 Blocks 区间dp
- poj 1390 Blocks (区间dp)
- poj 1390 Blocks(dp,黑书dp方块消除)
- POJ 3734 Blocks DP优化
- poj-1390-Blocks(方块消除)-DP
- poj 1390 Blocks (经典区间dp 方块消除)
- pku 1390 Blocks(DP)
- poj 1390 Blocks
- poj 1390 Blocks
- poj 1390 blocks
- Android ExifInterface对JPG文件的exif信息进行读写
- 哈理工OJ 1630 网线 【建图+Prime算法】
- leetcode 72. Edit Distance
- Android之dagger2实现依赖注入的原理
- 性能优化——内存优化建议(RAM)
- POJ 1390 Blocks DP *
- 1-gcc 选项
- Hadoop实战演练:搜索数据分析----TopK计算(2)
- 排序算法总结
- 对象的容纳
- HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)
- ubuntu设置DNS永久生效
- javaEE实现数据库信息简单显示在浏览器上
- 【技能储备】关于自学FreeMarker导出word的那些事