错误代码
#include<iostream>
#include<cstring>
using namespace std;
struct Segment{
int color;
int len;
};
Segment segments[210];
int score[210][210][210];
int clickBox(int i,int j,int len){
if(score[i][j][len]!=-1){
return score[i][j][len];
}
int result=(segments[j].len+len)*
(segments[j].len+len);
if(i==j){
return result;
}
result+=clickBox(i,j-1,0);
for(int k=i;k<=j-1;k++){
if(segments[k].color!=segments[j].color){
continue;
}
int r=clickBox(k+1,j-1,0);
r+=clickBox(i,k,segments[j].len+len);
result=max(r,result);
}
score[i][j][len]=result;
return result;
}
int main(){
int t;
cin>>t;
for(int i=1;i<=t;i++){
int n;
cin>>n;
memset(score,0xff,sizeof(score));
int lastC=0;
int segNum=-1;
for(int i=0;i<n;i++){
int c;
cin>>c;
if(c !=lastC){
segNum++;
segments[segNum].len=1;
segments[segNum].color=c;
}
else{
segments[segNum].len++;
}
}
cout<<"Case"<<":"<<clickBox(0,segNum,0)<<endl;
}
return 0;
}
正确代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Segment{
int len;
int color;
}segments[210];
int score[210][210][210];//这个数组的作用是for循环时,需要用到
int clickBox(int i,int j,int len){
if(score[i][j][len]!=-1){//记忆性数组
return score[i][j][len];
}
//直接点击j颜色的方块片段;
int result=(segments[j].len+len)*(segments[j].len+len);
if(i==j){
return result;//出口或者是边界条件
}
result+=clickBox(i,j-1,0);//直接点击后的左面的最大积分
//for循环从最远的到最近的,遍历,找出了所有颜色相同的颜色块号
for(int k=i;k<=j-1;k++){
if(segments[k].color!=segments[j].color){
continue;
}
int r=clickBox(k+1,j-1,0);
r+=clickBox(i,k,segments[j].len+len);//
result=max(result,r);
//最后比较到底是先 点击的得分多,
//还是和后面 合并的得分多
}
score[i][j][len]=result;
return result;
}
int main(){
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++){
int n;
memset(score,0xff,sizeof(score));
int lastC=0;//
int segNum=-1;//
scanf("%d",&n);
for(int j=0;j<n;j++){
int c;//
scanf("%d",&c);//
if(c!=lastC){
segNum++;
segments[segNum].len=1;
segments[segNum].color=c;
//这里必须要用c不能用segNum因为表示的是相同的颜色
lastC = c;//看下面的是不是与前一个相同
}
else{
segments[segNum].len++;
}
}
printf("Case %d: %d\n",i,clickBox(0,segNum,0));
}
return 0;
}
思路:除了要升维,还要注意遍历所有的鱼嘴有一个颜色块相同颜色的颜色块。
待检验的思路:如果for循环从后往前走哪!!!