有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000。现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若这段里有k个不同的数,那不河蟹度为k*k。那总的不河蟹度就是所有段的不河蟹度的总和。
有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000。现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若这段里有k个不同的数,那不河蟹度为k*k。那总的不河蟹度就是所有段的不河蟹度的总和。
第一行:两个整数N,M
第2..N+1行:N个整数代表每个奶牛的编号
一个整数,代表最小不河蟹度
1 #include<bits/stdc++.h> 2 using namespace std; 3 int const N=40000+10; 4 int const inf=1e8; 5 int dp[N],n,m,b[210],pre[N],c[N],t[N]; 6 int main(){ 7 scanf("%d%d",&n,&m); 8 for(int i=1;i<=n;i++){ 9 scanf("%d",&c[i]); 10 pre[i]=t[c[i]]; 11 t[c[i]]=i; 12 } 13 memset(t,0,sizeof(t)); 14 int num=0; 15 for(int i=1;i<=n;i++){ 16 int k=0; 17 for(int j=num;j>=1;j--) 18 if(b[j]>pre[i]) { 19 k=j; break; 20 } 21 if(k){ 22 for(int j=k-1;j>=1;j--) 23 b[j+1]=b[j]; 24 b[1]=i; 25 } 26 if(num<200 && !t[c[i]]) b[++num]=1; 27 dp[i]=inf; 28 for(int j=1;j<=num;j++) 29 dp[i]=min(dp[i],dp[b[j]-1]+j*j); 30 } 31 cout<<dp[n]<<endl; 32 return 0; 33 34 }
原文:https://www.cnblogs.com/ZJXXCN/p/11137136.html