标签:des style http color io os java ar strong
DP + 优化 ,因为花费是n^2的,所以num×num 大于 DP【i】的时候就可以跳出了。。。。
3 1 3 3 10 3 4 2 4 4 2 4 3 2 2
2 7
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> using namespace std; int n,a[50050],b[50050],last[50050]; int dp[50050]; map<int,int> mp; int fa[50050]; int find(int x) { if(x==fa[x]) return x; return fa[x]=find(fa[x]); } void bing(int x,int y) { int X=find(x),Y=find(y); if(X==Y) return ; fa[Y]=X; } int main() { while(scanf("%d",&n)!=EOF) { for(int i=1;i<=n;i++) { scanf("%d",a+i); b[i]=a[i]; } sort(b+1,b+n+1); int cnt=unique(b,b+n+1)-b; for(int i=1;i<cnt;i++) { mp[b[i]]=i; } for(int i=0;i<=n;i++) { a[i]=mp[a[i]]; fa[i]=i; last[i]=-1; } for(int i=1;i<=n;i++) { if(last[a[i]]!=-1) { bing(last[a[i]]-1,last[a[i]]); } last[a[i]]=i; dp[i]=i; int num=0; for(int j=i;j>0;j=find(j-1)) { num++; if(num*num>dp[i]) break; int next=find(j-1); dp[i]=min(dp[i],dp[next]+num*num); } } printf("%d\n",dp[n]); } return 0; }
标签:des style http color io os java ar strong
原文地址:http://blog.csdn.net/ck_boss/article/details/39303763