参照黑书上写的。 #include <string> #include <vector> #include <cmath> #include <queue> #include <algorithm> #include <iostream> #define PI 3.14159265358979323846264338327950288 #define _clr(a,b) memset(a,b,sizeof(a)) template<class T> T _abs(T a) { if(a<0) return -a;return a;} template<class T> void get_min(T& a,T b) { if(a>b) a=b;} template<class T> void get_max(T& a,T b) { if(a<b) a=b;} using namespace std; struct node { int color,len; }nodes[205]; int index; int DP[205][205][205]; int F(int start,int end,int k) { if(DP[start][end][k]) return DP[start][end][k]; if(start==end) DP[start][end][k]=(nodes[start].len+k)*(nodes[start].len+k); else if(end-start==1) DP[start][end][k]=(nodes[end].len+k)*(nodes[end].len+k)+nodes[start].len*nodes[start].len; else { DP[start][end][k]=F(start,end-1,0)+(nodes[end].len+k)*(nodes[end].len+k); for(int i=start;i<end;i++) { if(nodes[i].color==nodes[end].color) { get_max(DP[start][end][k],F(i+1,end-1,0)+F(start,i,nodes[end].len+k)); } } } return DP[start][end][k]; } int main() { int T; scanf("%d",&T); int last_color,cnt,color; for(int t=1;t<=T;t++) { _clr(DP,0); last_color=-1; cnt=index=0; int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&color); if(color==last_color) cnt++; else { nodes[index].color=last_color; nodes[index].len=cnt; cnt=1; last_color=color; index++; } } nodes[index].color=last_color; nodes[index].len=cnt; printf("Case %d: %d/n",t,F(1,index,0)); } return 0; }