结题报告poj 1390
2016-04-03 00:07
351 查看
参考视频https://www.coursera.org/learn/suanfa-jichu/lecture/lJll3/fang-he-you-xi
poj地址http://poj.org/problem?id=1390
poj地址http://poj.org/problem?id=1390
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <cstring> using namespace std; struct Block { int color; int len; }; struct Block segment[200]; int score[200][200][200];//存放计算结果,避免重复计算 //return start到end可以消除的最大积分 int click_box2(int start, int end, int extra_len) { if (score[start][end][extra_len]>0) return score[start][end][extra_len]; int result = segment[end].len+extra_len;//end和end 之后extra_len一起消去的得分 result = result*result; if (start==end) { return score[start][end][extra_len] = result; } //消除最后一个大块的积分+开始到前一个大块的最优积分 result += click_box2(start, end - 1, 0); int i = end - 1; for (; i >= start;i--) {//便利找有没有颜色一样的 if (segment[i].color!=segment[end].color) continue; int temp = click_box2(start, i, segment[end].len + extra_len) + click_box2(i + 1, end - 1, 0); if (temp>result) { result = temp; } } return score[start][end][extra_len] = result; } int main() { // freopen("d://uva_in.txt", "r", stdin); int t, n, i, j, end, color; cin >> t; for (i = 0; i < t;i++) { cin >> n; end = 0;//大块数目 cin >> segment[end].color; segment[end].len = 1; for (j = 1; j < n;j++) { cin >> color; if (color == segment[end].color)segment[end].len++; else { end++; segment[end].color = color; segment[end].len = 1; } } memset(score, 0, sizeof(score)); cout << "Case " << i + 1 << ": " << click_box2(0, end, 0) << endl; } return 0; }
相关文章推荐
- Angularjs学习笔记1_基本技巧
- 实例化String 对象/"=="与“equals方法”/String类的不可变性
- C# 服务器、客户端学习(三)
- SDAU 搜索总结
- 有朋友要招聘,这里做个广告!
- TCP客户端程序的编写
- C语言-位运算
- mac osx 系统 brew install hadoop 安装指南
- TCP解决端口冲突问题
- 【BZOJ2326】【HNOI2011】数学作业
- Tcp的通信的简单程序
- TCP服务器和多个客户端传输数据
- 75道程序员面试逻辑思维题
- ORA-20000的解决过程
- 2013 黄金连分数
- 计算一个矩阵从左上角到右下角和最大
- 《Linux内核分析》 第六节 分析Linux内核创建一个新进程的过程
- PHP错误处理函数
- PHP中的Trait 特性及作用
- PHP命名空间和自动加载类