标签:des style blog http color io os ar for
3 1 3 3 10 3 4 2 4 4 2 4 3 2 2
2 7
题目大意:
给定一系列的颜色,可以划分为任意多个任意大小的区间,每个区间的花费为 区间颜色数的平方,问你总花费最小是多少?
解题思路:
用动态规划,双向链表其实就是维护前面不同的元素,相同的元素删除。
我参照的是:http://blog.csdn.net/u011345136/article/details/39759935
解题代码:
#include <iostream>
#include <map>
#include <cstdio>
using namespace std;
const int maxn=51000;
int n,d[maxn],dp[maxn],pre[maxn],next[maxn];
map <int,int> mp;
//mp 记录数字对应的下标
//pre 记录前驱
//next 记录后继
void solve(){
mp.clear();
for(int i=1;i<=n;i++){
pre[i]=i-1;
next[i]=i+1;
dp[i]=(1<<30);
}
dp[0]=0;pre[0]=-1;
for(int i=1;i<=n;i++){
if(mp.find(d[i])==mp.end()) mp[d[i]]=i;
else{
int id=mp[d[i]];
next[pre[id]]=next[id];
pre[next[id]]=pre[id];
mp[d[i]]=i;
}
int c=0;
for(int j=pre[i];j!=-1;j=pre[j]){
c++;
dp[i]=min(dp[i],dp[j]+c*c);
if(c*c>=i) break;
}
}
printf("%d\n",dp[n]);
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++) scanf("%d",&d[i]);
solve();
}
return 0;
}
标签:des style blog http color io os ar for
原文地址:http://blog.csdn.net/a1061747415/article/details/39830329