题目链接: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. Thingworx SDK开发自定义Widget

    Thingworx自带的图表数量有限,样式也很有限,在echarts上看到了这样一个非常简单的图表,下面将做一个简单的静态引入示范 首先创建Thingworx项目 然后右键ui新建widget 自动生 ...

  2. javaScript注释 to 颜文字

    将javascript 注释(alert.console)转化为 颜文字语言. http://utf-8.jp/public/aaencode.html

  3. JavaScript中必记英语单词及含义

    reflow[ri'flo]:回流,重构(通过css改变页面的结构,比如一行元素,其中一个元素的高改变了,那么其他元素的位置也都会改变) repaint['ripent]:重绘(只改变页面的样式,比如 ...

  4. ajax第二天学习

    post方式发送请求 要首先设置请求头(参数设置为ajax.setRequestHeader("content-type","application/x-www-form ...

  5. Hive 基本操作

    1.创建一个表 (字段表名不加引号‘,分隔符需要加引号) create table t1( id int ,name string ,hobby array<string> ,add ma ...

  6. create raid5

    # umout 所有数据disk for i in {1..11};do umount /disk$i;done # 修改/etc/fstab,注释掉 /dev/sd[b-l] vim /etc/fs ...

  7. static和extern的作用域--题目

    #include <stdio.h> ; int main(void) { , sum = , count = ; ,count++) // count = 2 { ; count++; ...

  8. poi操作excel2007(读取、生成、编辑)

    因为现在再写excel2003版的比较low,所以我在这就不介绍了,直接介绍2007,我所用的编程软件是IDEA poi操作office总共有6个jar包,在pom.xml文件中配置如下,也可下载后直 ...

  9. 机器学习关于AUC的理解整理

    AUC 几何意义:ROC曲线与X轴的面积 https://blog.csdn.net/luo3300612/article/details/80367901 AUC物理意义:随机给定一个正样本和一个负 ...

  10. Android开发之AlarmManager具体解释

    AlarmManager实质是一个全局的定时器,是Android中经常使用的一种系统级别的提示服务,在指定时间或周期性启动其他组件(包含Activity,Service,BroadcastReceiv ...