标签: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