| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
100题+1A 留念话说这题过的悬啊。。。
不过一月一百题还是稍微纪念一下~
//poj1390 递归方法
#include <iostream>
#include <memory.h>
using namespace std;
short int len[202];//len[i]表示第i段的长度
short int color[202];//color[i]表示第i段的颜色
bool vis[202][202][202];
short int re[202][202][202];
int findmax(int i,int j,int k)
{
if(vis[i][j][k]==true)
return re[i][j][k];
if(i==j)
return (len[i]+k)*(len[i]+k);
if(i>j)
return 0;
//表示起始段i到终止段j的闭区间和此区间后与j段颜色相同的长度k合并的最大值
int result=0;
result=findmax(i,j-1,0);
result+=(len[j]+k)*(len[j]+k);//当前result表示直接算第j段时的最大值
int p=i;
while(p<j)
{
if(color[p]!=color[j])
{
p++;
continue;
}
else
{
//当存在第p段,其颜色与第j段相同时,尝试合并这两端,求其值
int temp1=findmax(i,p,len[j]+k);
int temp2=findmax(p+1,j-1,0);
int curresult=temp1+temp2;
if(result<curresult)
result=curresult;
p++;
}
}
re[i][j][k]=result;
vis[i][j][k]=true;
return result;
}
void init()
{
memset(len,0,sizeof(len));
memset(color,0,sizeof(color));
memset(vis,false,sizeof(vis));
memset(re,0,sizeof(re));
}
int main()
{
int rounds;
cin>>rounds;
int casenum=0;
int blocknum;
while(rounds--)
{
init();
casenum++;
cin>>blocknum;
int i=1;
int curcolor;
int precolor=-1;
int curseg=1;
while(i<=blocknum)
{
cin>>curcolor;
i++;
if(curcolor==precolor||precolor==-1)
{
if(precolor==-1)
color[curseg]=curcolor;
precolor=curcolor;
len[curseg]++;
}
else
{
precolor=curcolor;
curseg++;
color[curseg]=curcolor;
len[curseg]++;
}
}
int result=findmax(1,curseg,0);
cout<<"Case "<<casenum<<": "<<result<<endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator