题目链接:https://cn.vjudge.net/problem/HDU-5009

题意

给一串序列,可以任意分割多次序列,每次分割的代价是被分割区间中的数字种数。

求分割区间的最小代价。n<=5e4

例:1 3 3

答:2

思路

今天刚讲的dp题目,这次讲课收益非常,写个题解。

状态和转移是dp[i]=min(dp[j]+cnt[j-1][i]^2)

会发现这样绝对超时,又发现这里的j可以贪心的跳着选择(因为种数相同时,左端点应越小越好)。

这里的跳着选择想了半天没什么思路,又是最后看了题解-_-

双向链表在排除某一元素时非常有用,以前只用过一次,这次真的是感受到这玩意的通用之处了(话说这个东西应该非常方便,继并查集之后的又一轻量级数据结构)

提交过程

TLE 注意当区间的种类超过sqrt(i)时,不如一个一个选,跳出即可
WA 注意边界dp[0]=0, 而非dp[1]=1
AC

代码

#include <map>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=5e4+20, INF=0x3f3f3f3f;
int n, clr[maxn], pre[maxn], nex[maxn];
int dp[maxn]; int main(void){
while (scanf("%d", &n)==1 && n){
for (int i=1; i<=n; i++) scanf("%d", &clr[i]); for (int i=1; i<=n; i++) dp[i]=INF;
for (int i=1; i<=n; i++)
pre[i]=i-1, nex[i]=i+1;
pre[0]=-1; nex[n]=-1; dp[0]=0;
map<int, int>id;
for (int i=1; i<=n; i++){
if (!id.count(clr[i])) id[clr[i]]=i;
else{
int idx=id[clr[i]];
pre[nex[idx]]=pre[idx];
nex[pre[idx]]=nex[idx];
id[clr[idx]]=i;
} for (int k=pre[i], cnt=1; k!=-1; k=pre[k], cnt++){
dp[i]=min(dp[i], dp[k]+cnt*cnt);
if (cnt*cnt>i) break;
}
}
printf("%d\n", dp[n]);
} return 0;
}
Time Memory Length Lang Submitted
686ms 3444kB 975 G++ 2018-08-13 08:37:10

HDU-5009 Paint Pearls 动态规划 双向链表的更多相关文章

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

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

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

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

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

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

  4. HDU - 5009 Paint Pearls(dp+优化双向链表)

    Problem Description Lee has a string of n pearls. In the beginning, all the pearls have no color. He ...

  5. hdu 5009 Paint Pearls

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

  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. JAVA 静态内部类--转自http://bbs.csdn.net/topics/350021609

    内部类其实并不是非要声明成static的..主要还是要看实际情况决定..静态和非静态有不同的作用.. 引用一篇文章给楼主参考下吧. 在一个类中创建另外一个类,叫做成员内部类.这个成员内部类可以静态的( ...

  2. 利用cookie判断文件下载完成

    在网页下载文件时,该文件又是通过后台代码生成的,比如报表之类的.当需要生成文件过大时会耗费很多时间,而文件生成好传到页面的时候也没有事件可以监听它,像微软官网,谷歌,百度等下载方式都是通过提示五秒过后 ...

  3. CentOS 7编译安装Python3.7.X

    在CentO S上通过编译安装Python3.7,添加python3软链,并使用python3. 环境 安装环境如下: Windows 10 Pro VMWare Workstation 15 Pro ...

  4. js 获取对象长度

    获取对象的程度,可以这样获取: var myObj = {a:1,b:2,c:3} var arr = Object.keys(myObj);var len = arr.length  console ...

  5. Hdu 1429 胜利大逃亡(续) (bfs+状态压缩)

    这道题的钥匙只有10个,可以压成二进制 这里有有句非常关键的话 (k & door[x][y]) == door[x][y] 一开始以为只要(k & door[x][y]) ==1就可 ...

  6. [terry笔记]python FTP

    如下是作业,用python做一个ftp,主要利用socket. server端在linux下运行,在client端可以执行shell命令(静态的) 在client端输入get xxx,即可下载. 在c ...

  7. HDU 4328 Contest 3

    悬线法可解,稍有点烦琐. #include <iostream> #include <cstdio> #include <cstring> #include < ...

  8. ZOJ 3829 模拟贪心

    2014牡丹江现场赛水题 给出波兰式,推断其是否合法.假设不合法有两种操作: 1:任何位置加一个数字或者操作符 2:随意两个位置的元素对调 贪心模拟就可以 先推断数字数是否大于操作符数,若不大于 an ...

  9. (插播)关于使用jenkins + unity +Xcode 来进行自己主动打包的处理。

    近期了解了下jenkins流程化服务的东西,个人感觉jenkins是一个非常方便的工具.主要是方便.设置好流程性得命令.仅仅需确定下就能够达到自己主动化. 减轻了错误得发生和简化了带来的复杂得步骤.今 ...

  10. 阿里云部署Docker(8)----安装和使用redmine

    安装redmine对过程进行管理. 须要说明的是:当你在docker images的时候,会说没连接到xxxx的时候,并且会提示用"docker -d".事实上这仅仅是把docke ...