标签:
3 1 3 3 10 3 4 2 4 4 2 4 3 2 2
2 7
因为颜色范围比较大,可以对颜色进行离散化便于处理。然后暴力,G++可以通过。
#include<stdio.h> #include<string.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; #define ll __int64 #define N 50005 const int inf=0x1f1f1f1f; int dp[N]; struct node { int val,id,col; }a[N]; vector<int>g; int vis[N]; bool cmpval(node a,node b) { return a.val<b.val; } bool cmpid(node a,node b) { return a.id<b.id; } int main() { int i,j,n,cnt; while(scanf("%d",&n)!=-1) { for(i=1;i<=n;i++) { scanf("%d",&a[i].val); } cnt=1; for(i=2;i<=n;i++) //颜色一样的连续石子保留一个 if(a[i].val!=a[i-1].val) a[++cnt]=a[i]; n=cnt; for(i=1;i<=n;i++) //原始顺序 a[i].id=i; sort(a+1,a+n+1,cmpval); a[1].col=0; cnt=0; for(i=2;i<=n;i++) //为石子颜色重新编号 { if(a[i].val!=a[i-1].val) a[i].col=++cnt; else a[i].col=cnt; } sort(a+1,a+n+1,cmpid); for(i=0;i<=n;i++) dp[i]=inf; dp[0]=0; dp[n]=n; for(i=0;i<n;i++) { cnt=0; for(j=i+1;j<=n;j++) { if(!vis[a[j].col]) { cnt++; vis[a[j].col]=1; g.push_back(a[j].col); } if(dp[i]+cnt*cnt>=dp[n]) //优化 break; dp[j]=min(dp[j],dp[i]+cnt*cnt); } for(j=0;j<cnt;j++) //优化 vis[g[j]]=0; g.clear(); } printf("%d\n",dp[n]); } return 0; }
标签:
原文地址:http://blog.csdn.net/u011721440/article/details/43411603