您的位置:首页 > 其它

结题报告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

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: