| ||||||||||
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