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