传送门:HDU 5009

题意:给出n个连续的珠子,珠子有不同的颜色,现将其划分成任意多段,每一段的代价为该段中颜色种数的平方,问划分的最小总代价和是多少。

总思路:dp[i]代表处理到第i个珠子的最小花费,显然dp[i] = min(dp[j] + num[i][j] * num[i][j])(0 < j <= i)   num[i][j]代表[j...i]区间内的颜色种数。n^2转移显然不能接受。

优化方法1:用双向链表维护珠子的颜色,使得任意时刻已经遍历过的珠子中每种颜色都只保存一个最新位置,每次遇到一个重复的颜色,就将该颜色前一个位置从链表中删除,然后利用双向链表维护dp数组,因为链表每个节点都代表该位置有一个新的颜色,因此可以避免很多无用操作,但这还不够,如果给出序列为1,2,3。。。。n,那么链表就毫无用处了,因此我们还要加一个下界优化:显然dp[n] <= n,因为最差情况每个珠子分一段,这时dp[n] == n。

代码:

#include<bits/stdc++.h>
#define ll long long
#define pi acos(-1)
#define MAXN 50010
#define inf 0x3f3f3f3f
using namespace std;
typedef pair<int,int>P;
int a[MAXN], val[MAXN];
int pre[MAXN], nxt[MAXN];
int last[MAXN], dp[MAXN];
int main()
{int n, m, id, cnt;while(cin >> n){for(int i = 1; i <= n; i++){scanf("%d", a + i);val[i] = a[i];pre[i] = i - 1;nxt[i] = i + 1;last[i] = 0;dp[i] = inf;}dp[0] = 0; pre[0] = -1;sort(val + 1, val + n + 1);m = unique(val + 1, val + n + 1) - val;for(int i = 1; i <= n; i++){a[i] = lower_bound(val + 1, val + m, a[i]) - val;id = last[a[i]];if(id){pre[nxt[id]] = pre[id];nxt[pre[id]] = nxt[id];}last[a[i]] = i;cnt = 0;for(int j = pre[i]; ~j; j = pre[j]){cnt++;dp[i] = min(dp[i], dp[j] + cnt * cnt);if(cnt * cnt >= n) break;}}printf("%d\n", dp[n]);}return 0;
}

优化方法2:将连续的同样颜色的珠子缩成一个珠子(易证这样做不影响dp结果的正确性),然后再用下界进行剪枝就行了。代码详见:点击打开链接

HDU - 5009 Paint Pearls dp + 链表 + 下界优化相关推荐

  1. hdu 4391 Paint The Wall 线段树 +优化 2012 Multi-University Training Contest 10 )

    http://acm.hdu.edu.cn/showproblem.php?pid=4391 题意: 刷墙, 以开始 有 n个节点,每个节点有一种颜色 ,m 次询问 m次  输入 a,l,r,z 如果 ...

  2. AC日记——Paint Pearls hdu 5009

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

  3. Codevs 3002 石子归并 3(DP四边形不等式优化)

    3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...

  4. codeforces #274 C. Riding in a Lift dp+前缀和优化

    codeforces #274  C. Riding in a Lift   dp+前缀和优化 Imagine that you are in a building that has exactly  ...

  5. hdu5489 Removed Interval dp+线段树优化

    现在看这题居然直接秒了...去年看的时候还以为神题.. 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j] ...

  6. 【HDU - 5009】Paint Pearls(dp,链表优化dp)

    题干: Lee has a string of n pearls. In the beginning, all the pearls have no color. He plans to color ...

  7. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

  8. HDU 1300 Pearls(DP)

    题意  珠宝店到珍珠批发商进货  第i种价格为p[i]的珍珠需要n个  则珍珠的结算价格为∑(n+10)*p[i]   由于没种珍珠的数量结算时都要加上10   所以有时候把便宜的珍珠换为贵的结算价格 ...

  9. HDU 4455 Substrings(dp+树状数组优化)

    题意: 给定一个序列ai,个数为n.再给出一系列w: 对于每个w,求序列中,所有长度为w的连续子串中的权值和,子串权值为子串中不同数的个数 解析: 一直想不出来怎么转移,看了网络上面的题解才明白怎么做 ...

最新文章

  1. Hibernate 关联映射 之 多对多 关联(二) 之拆分
  2. Hadoop自学笔记(七)Hadoop环境配置和优化
  3. Android安卓开发-'Theme.AppCompat.Light'无法找到的解决方案
  4. 服务器内存技术知识充电
  5. python numpy矩阵乘法_高维Python-Numpy矩阵乘法
  6. IOS开发地理编码与反向编码
  7. 笔记本移交_创建完美的设计移交
  8. MAVLink 协议解析之XML定义篇
  9. 【识记】Nginx 访问控制
  10. 15 Android系统安全(简要)
  11. 如何快速学从零开始学习3d建模?
  12. DDU(Display Driver Uninstaller) 18.0.3.5 显卡驱动彻底卸载清理工具,支持卸载NVIDIA, AMD, Intel
  13. 访问网络共享找不到网络名的解决方案
  14. C++(qt)游戏实战项目:坦克大战(五)
  15. 【计算机网络】三传输层--可靠传输原理rdt、GBN、SR
  16. Linux ps命令
  17. DecisionCurve决策曲线分析法
  18. unity动态加载obj文件
  19. java hevc和heif_HEVC和HEIF有哪些区别 HEVC和HEIF将兼容哪些设备
  20. VHDL语言设计8421码加法器(使用quartus)

热门文章

  1. ipv4服务器不显示怎么办,如何查看服务器ipv4地址
  2. 2018年春节长假旅游市场预测大数据报告
  3. 世上本无事,庸人自扰之。
  4. 多表查询、子查询、聚合函数
  5. 认识自己所承受的压力
  6. list的分批处理实现的几种方式
  7. “我在阿里做了5年招聘,给求职者10条建议”
  8. like能否使用索引?做个实验一探究竟
  9. java nio so_backlog_TCP的连接队列与backlog参数
  10. ai错误16_由于所有错误的原因,电视节目都应该让AI感到恐惧