HDU 5009
哎,自己还是太水了,感觉自己在比赛的时候感觉到了应该是要用DP的,但是不敢写呀!!!;
感觉到压力山大!!!
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
struct node
{
int val;
int id;
int shibie;
};
int dp[50005],vis[50005];
vector<int>lsan;
bool cmp1(node a,node b)
{
return a.val<b.val;
}
bool cmp2(node a,node b)
{
return a.id<b.id;
}
int min(int a,int b)
{
return a<b?a:b;
}
int main()
{
int m;
while(scanf("%d",&m)!=EOF)
{
int i,j;
node p[50005];
for(i=1;i<=m;i++)
{
scanf("%d",&p[i].val);
p[i].id=i;
}
int number=1;
// int number1=1;
for(i=2;i<=m;i++)
{
if(p[i].val!=p[i-1].val)
{
p[++number]=p[i];
}
}
for(i=1;i<=number;i++)
p[i].id=i;
sort(p+1,p+number+1,cmp1);
p[1].shibie=0;
int s=0;
for(i=2;i<=number;i++)
{
if(p[i].val!=p[i-1].val)
s++;
p[i].shibie =s;
}
sort(p+1,p+number+1,cmp2);
//fill(dp,INF,sizeof(dp));
for(i=0;i<=number;i++)
dp[i]=INF;
dp[0]=0;
//dp[1]=1;
dp[number]=number;
for(i=0;i<number;i++)
{
int cnt=0;
if(dp[i]>dp[i+1])
continue;
for(j=i+1;j<=number;j++)
{
if(vis[p[j].shibie]==0)
{
lsan.push_back(p[j].shibie);
cnt++;
}
vis[p[j].shibie]++;
if(dp[i]+cnt*cnt>=dp[number])
break;
dp[j]=min(dp[j],dp[i]+cnt*cnt);
//cout<<cnt<<" "<<j<<" "<<dp[j]<<" "<<endl;
}
for(j=0;j<lsan.size();j++)
vis[lsan[j]]=0;
lsan.clear();
}
//for(i=1;i<=number;i++)
cout<<dp[number]<<endl;
}
}