HDU - 5009 Paint Pearls dp + 链表 + 下界优化
传送门: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 + 链表 + 下界优化相关推荐
- 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 如果 ...
- AC日记——Paint Pearls hdu 5009
Paint Pearls 思路: 离散化+dp+剪枝: dp是个n方的做法: 重要就在剪枝: 如果一个长度为n的区间,有大于根号n种颜色,还不如一个一个涂: 来,上代码: #include <c ...
- Codevs 3002 石子归并 3(DP四边形不等式优化)
3002 石子归并 3 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次 ...
- 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 ...
- hdu5489 Removed Interval dp+线段树优化
现在看这题居然直接秒了...去年看的时候还以为神题.. 设以第i项为结尾的lis前缀为f[i],以第j项为结尾的lis后缀为g[i],如果求出f[i]和g[j],然后枚举i,快速找到最大的满足a[j] ...
- 【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 ...
- HDU 2993 MAX Average Problem(斜率优化DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...
- HDU 1300 Pearls(DP)
题意 珠宝店到珍珠批发商进货 第i种价格为p[i]的珍珠需要n个 则珍珠的结算价格为∑(n+10)*p[i] 由于没种珍珠的数量结算时都要加上10 所以有时候把便宜的珍珠换为贵的结算价格 ...
- HDU 4455 Substrings(dp+树状数组优化)
题意: 给定一个序列ai,个数为n.再给出一系列w: 对于每个w,求序列中,所有长度为w的连续子串中的权值和,子串权值为子串中不同数的个数 解析: 一直想不出来怎么转移,看了网络上面的题解才明白怎么做 ...
最新文章
- Hibernate 关联映射 之 多对多 关联(二) 之拆分
- Hadoop自学笔记(七)Hadoop环境配置和优化
- Android安卓开发-'Theme.AppCompat.Light'无法找到的解决方案
- 服务器内存技术知识充电
- python numpy矩阵乘法_高维Python-Numpy矩阵乘法
- IOS开发地理编码与反向编码
- 笔记本移交_创建完美的设计移交
- MAVLink 协议解析之XML定义篇
- 【识记】Nginx 访问控制
- 15 Android系统安全(简要)
- 如何快速学从零开始学习3d建模?
- DDU(Display Driver Uninstaller) 18.0.3.5 显卡驱动彻底卸载清理工具,支持卸载NVIDIA, AMD, Intel
- 访问网络共享找不到网络名的解决方案
- C++(qt)游戏实战项目:坦克大战(五)
- 【计算机网络】三传输层--可靠传输原理rdt、GBN、SR
- Linux ps命令
- DecisionCurve决策曲线分析法
- unity动态加载obj文件
- java hevc和heif_HEVC和HEIF有哪些区别 HEVC和HEIF将兼容哪些设备
- VHDL语言设计8421码加法器(使用quartus)