Problem Description
Lee has a string of n pearls. In the beginning, all the pearls have no color. He plans to color the pearls to make it more fascinating. He drew his ideal pattern of the string on a paper and asks for your help. 



In each operation, he selects some continuous pearls and all these pearls will be painted to their target colors. When he paints a string which has k different target colors, Lee will cost k2 points. 



Now, Lee wants to cost as few as possible to get his ideal string. You should tell him the minimal cost.
 
Input
There are multiple test cases. Please process till EOF.



For each test case, the first line contains an integer n(1 ≤ n ≤ 5×104), indicating the number of pearls. The second line contains a1,a2,...,an (1 ≤ ai ≤ 109) indicating the target color of each
pearl.
 
Output
For each test case, output the minimal cost in a line.
 
Sample Input
3
1 3 3
10
3 4 2 4 4 2 4 3 2 2
 
Sample Output
2
7
 
Source

题意:有n个珠子须要你染上特定的颜色。初始的时候是没有染色的。每次染的代价是不同颜色的平方。

思路:借鉴一段题解:双向链表优化dp。dp[i]表示涂完前i个所化的最小代价,显然有dp[i]=min{dp[j]+num(j+1,i)^2},当中1<=j<i,num(j+1,i)表示区间[j+1,i]的颜色个数。

这样复杂度为O(n^2)显然超时。那么须要优化一下,比方第二组測试数据3 4 2 4 4 2 4 3 2 2,如果dp[1]...dp[8]已更新完成。如今要更新dp[9],能够看到a[9]为2。依照原始的dp[i]=min{dp[j]+num(j+1,i)^2},

i=9,枚举j=8,dp[9]=min{dp[9],dp[8]+1^2};j=7,dp[9]=min{dp[9],dp[7]+2^2};如今貌似没什么变化。。。

j=6,这里就奇妙了,假设dp[9]=min{dp[9],dp[6]+3^2},那么这个就太弱了,由于此时2 4 3是连着涂的,可是2之前是3 4 2 4 4,这些假设跟着一起涂,那么仍然是3^2的代价。但前面的数字变少了。显然这样的更优。

于是乎dp[9]=min{dp[9],dp[0]+3^2},能够看到6直接跳到了0,为什么这么跳?由于这之前都是些234啊,反复了不是必需保存。

所以在dp时,我们仅仅须要维护好前后关系就可以。

比方当前dp第i位,那么即a[i]加进来,所以之前假设有a[i]值的必须删掉。详细双向链表维护。因此能够看到随意时刻。每种颜色仅仅会保存一次。复杂度就降下来了。

但仍然能够给出坑爹的数据,比方1 2 3 4 ... n那么这个dp的话,复杂度仍为O(n^2),于是继续优化。

我们知道假设一个一个涂,那么须要花费n。

所以最优方案不能大于n。也就是不能连着sqrt(n)个不同的颜色一起涂,否则代价大于n了。这里进行剪枝。复杂度降为O(nsqrt(n)),还是能够接受的。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
const int maxn = 50010;
const int inf = 0x3f3f3f3f; int a[maxn], pre[maxn], nxt[maxn], dp[maxn];
map<int, int> mp; int main() {
int n;
while (scanf("%d", &n) != EOF) {
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
pre[i] = i - 1;
nxt[i] = i + 1;
} mp.clear();
memset(dp, inf, sizeof(dp));
dp[0] = 0, pre[0] = -1;
for (int i = 1; i <= n; i++) {
if (!mp.count(a[i])) mp[a[i]] = i;
else {
int id = mp[a[i]];
nxt[pre[id]] = nxt[id];
pre[nxt[id]] = pre[id];
mp[a[i]] = i;
} int cnt = 0;
for (int j = pre[i]; j != -1; j = pre[j]) {
cnt++;
dp[i] = min(dp[i], dp[j] + cnt * cnt);
if (cnt * cnt > i)
break;
}
} printf("%d\n", dp[n]);
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

HDU - 5009 Paint Pearls(dp+优化双向链表)的更多相关文章

  1. HDU 5009 Paint Pearls 双向链表优化DP

    Paint Pearls Problem Description   Lee has a string of n pearls. In the beginning, all the pearls ha ...

  2. HDU 5009 Paint Pearls(西安网络赛C题) dp+离散化+优化

    转自:http://blog.csdn.net/accelerator_/article/details/39271751 吐血ac... 11668627 2014-09-16 22:15:24 A ...

  3. HDU 5009 Paint Pearls (动态规划)

    Paint Pearls Problem Description Lee has a string of n pearls. In the beginning, all the pearls have ...

  4. hdu 5009 Paint Pearls

    首先把具有相同颜色的点缩成一个点,即数据离散化. 然后使用dp[i]表示涂满前i个点的最小代价.对于第i+1个点,有两种情况: 1)自己单独涂,即dp[i+1] = dp[i] + 1 2)从第k个节 ...

  5. hdu5009 Paint Pearls[指针优化dp]

    Paint Pearls Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  6. hdu-5009 Paint Pearls DP+双向链表 with Map实现去重优化

    http://acm.hdu.edu.cn/showproblem.php?pid=5009 题目要求对空序列染成目标颜色序列,对一段序列染色的成本是不同颜色数的平方. 这题我们显然会首先想到用DP去 ...

  7. HDOJ 5009 Paint Pearls

    Dicripntion Lee has a string of n pearls. In the beginning, all the pearls have no color. He plans t ...

  8. AC日记——Paint Pearls hdu 5009

    Paint Pearls 思路: 离散化+dp+剪枝: dp是个n方的做法: 重要就在剪枝: 如果一个长度为n的区间,有大于根号n种颜色,还不如一个一个涂: 来,上代码: #include <c ...

  9. hdu5009 Paint Pearls (DP+模拟链表)

    http://acm.hdu.edu.cn/showproblem.php?pid=5009 2014网络赛 西安 比较难的题 Paint Pearls Time Limit: 4000/2000 M ...

随机推荐

  1. 5G关键技术研究方向

    对于还没体验4G移动通信魅力的国内的移动通信用户而言,5G也许还是镜中花,雾中月:但对于科研界而言,5G研究已经启程,三星电子5月份宣布,率先开发出了首个基于5G核心技术的移动传输网络,实现每秒1Gb ...

  2. 安卓自定义view_GDI绘图 _2d绘图_canvas绘图

    2014年到2016年 发生了很多事情,如今已成定局,现在想忘掉这些烦恼的事情,找点以前想干没有干的事情来做,塞满大脑就不去想了. 之前,一直想做一款挂机类游戏,各种平台和开发语言都选择过了,从htm ...

  3. php study plan personal

    Php study schedule personal: 1. php intro + upper : imooc2. video course: php100, houdunwang (togeth ...

  4. 获取多个汉字首字母(php)

    <?php function getfirstchar($s0){ $fchar = ord($s0{0}); if($fchar >= ord("A") and $f ...

  5. codevs 1183 泥泞的道路 01分数规划

    题目链接 题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和 ...

  6. HUB主要芯片方案

    HUB主要品牌:慧荣.擎泰.联盛  安国.创惟 创惟GL850G简介:拥有低耗电.温度低及接脚数减少等产品特性.它支援4个下游连接埠,采用48 pin LQFP封装,可完全支援USB 2.0/1.1规 ...

  7. Uber司机一周体验记:成单率仅57%

    虽然注册过程不顺利,但耗时一下午终究还是当上人民优步司机了.而且一周下来也完成了十几单,个中滋味恐怕只有载着陌生的乘客开上路才能体会. 第一单 一位赶去面试的年轻人,刚来北京两年,因为路线不熟坐错了公 ...

  8. jira使用

    JIRA的生产者把JIRA定义为Professional Issue Tracker,即它是一个专业的问题跟踪管理的软件.这里的"问题"对应的英文单词是Issue,所以含义比较广, ...

  9. Android应用开发基础篇(15)-----URL(获取指定网址里的图片)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2389190.html 一.概述 URL,说白了就是一个网络地址(网址),通常一个网址里包 ...

  10. C++ STL中map存储方式——SAP电面(4)

    map存储方式  一般是平衡二叉树 红黑树