方块消除 (黑书)

来源:互联网 发布:kindle保护套推荐知乎 编辑:程序博客网 时间:2024/05/21 18:49

P123

题意: 把一个连续的不同颜色的进行消除,如果颜色相同的N块连在一起,可以一次消除,得分为N*N。然后在这种颜色的两端的方块合拢

           重新连到一起。

比如:1 2 2 2 2 3 3 3 1

最高得分为: 4*4+3*3+2*2=29


这个是看书后自己写的。



#include<iostream>#include<cstdio>#include<algorithm>#include<queue>#include<vector>#include<cmath>#include<set>#include<cstdlib>#include<cstring>#include<stack>#include<string>using namespace std;int color[1111];int len[1111];int go[111111];int n;int d(int k){return k*k;}int f(int i,int j,int v,int c){//cout<<i<<' '<<v<<' '<<c<<endl;int small=0;int k;if (i>j)return d(v);if (i<0)return d(v);if (i==j)return c==color[i]?d(len[i]+v):d(len[i])+d(v);for (k=i;k<=j;k++){if (c==color[k])small=max(small,f(i,k-1,v+len[k],c)+f(k+1,j,0,0));else small=max(small,f(i,k-1,len[k],color[k])+d(v)+f(k+1,j,0,0));}//cout<<small<<endl;return small;}int main(){freopen("in.txt","r",stdin);int i,j,k;while (cin>>n,n){for (i=0;i<n;i++)cin>>go[i];k=1;color[0]=go[0];len[0]=1;for (i=1;i<n;i++){if (go[i]==go[i-1]){len[k-1]++;}else {color[k]=go[i];len[k]=1;k++;}}for (i=0;i<k;i++)cout<<i<<' '<<f(0,i,0,0)<<endl;}return 0;}


原创粉丝点击