Paint Pearls
Paint Pearls
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5009
dp+双向链表优化
看到题目,很自然地可以定义状态:dp[i]表示涂好a[0...i]的字符串,花费的最小代价.
状态转移方程:dp[i]=min(dp[i],dp[j]+num2),其中num=从a[j]到a[i]不同的数字个数.
时间复杂度为O(n2),对于n=50000的数据,明显会T.
于是,我们需要进行优化。注意到状态数无法化简,考虑优化转移复杂度.
当区间[j+1,i]中包含元素a[j]时,无需再经过这个点,直接跳到a[j-1];
即a[j+1]前面略过a[j],直接为a[j-1],使得现序列中各个不同元素只出现一次.
而这种结构可以用双向链表维护.//之前用的是set,T了后查了下clear()是O(n)的,尴尬...
但是当序列为1,2,3,4,5,6,7这种互不相同的元素时,复杂度仍会退化为O(n2),
这时,则需要用到剪枝的技巧:当num2>i时,肯定不会比一个一个涂色方法更优,
由此,复杂度变为O(n3/2)
代码如下:
#include<cstdio>
#include<map>
#define Min(x,y) (x<y?x:y)
#define N 50005
using namespace std;
const int INF=N;
struct List{
int pre,nxt;
List(int _pre=-,int _nxt=-){//ÈÃL[0].preÖ¸Ïò-1
pre=_pre;
nxt=_nxt;
}
}L[N];
int n,a[N],idx,num,dp[N];
map<int,int>mp;
int main(void){
while(~scanf("%d",&n)){
mp.clear();
for(int i=;i<=n;++i){
scanf("%d",&a[i]);
L[i]=List(i-,i+);
}
for(int i=;i<=n;++i){
dp[i]=INF;
if(mp.find(a[i])==mp.end()){
mp[a[i]]=i;
}else{
idx=mp[a[i]];
L[L[idx].pre].nxt=L[idx].nxt;
L[L[idx].nxt].pre=L[idx].pre;
mp[a[i]]=i;
}
for(num=,idx=L[i].pre;idx>=;idx=L[idx].pre,num++){
dp[i]=Min(dp[i],dp[idx]+num*num);
if(num*num>i)break;
}
}
printf("%d\n",dp[n]);
}
}
Paint Pearls的更多相关文章
- hdu5009 Paint Pearls (DP+模拟链表)
http://acm.hdu.edu.cn/showproblem.php?pid=5009 2014网络赛 西安 比较难的题 Paint Pearls Time Limit: 4000/2000 M ...
- HDU 5009 Paint Pearls 双向链表优化DP
Paint Pearls Problem Description Lee has a string of n pearls. In the beginning, all the pearls ha ...
- HDU 5009 Paint Pearls (动态规划)
Paint Pearls Problem Description Lee has a string of n pearls. In the beginning, all the pearls have ...
- hdu5009 Paint Pearls[指针优化dp]
Paint Pearls Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- AC日记——Paint Pearls hdu 5009
Paint Pearls 思路: 离散化+dp+剪枝: dp是个n方的做法: 重要就在剪枝: 如果一个长度为n的区间,有大于根号n种颜色,还不如一个一个涂: 来,上代码: #include <c ...
- HDU 5009 Paint Pearls(西安网络赛C题) dp+离散化+优化
转自:http://blog.csdn.net/accelerator_/article/details/39271751 吐血ac... 11668627 2014-09-16 22:15:24 A ...
- 2014 ACM/ICPC Asia Regional Xi'an Online Paint Pearls
传说的SB DP: 题目 Problem Description Lee has a string of n pearls. In the beginning, all the pearls have ...
- HDU - 5009 Paint Pearls(dp+优化双向链表)
Problem Description Lee has a string of n pearls. In the beginning, all the pearls have no color. He ...
- HDOJ 5009 Paint Pearls
Dicripntion Lee has a string of n pearls. In the beginning, all the pearls have no color. He plans t ...
随机推荐
- HTML5 智能表单
HTML5 智能表单 1.表单新增属性 ☀ autofocus 属性 <input type="text" autofocus/>设置 autofocus 属性,使文 ...
- java基础练习 9
import java.util.Scanner; public class Ninth { /*取一个整数a从右端开始的4-7位.*/ public static void main(String[ ...
- Kubernetes(k8s)容器运行时(CRI)
Kubernetes节点的底层由一个叫做"容器运行时"的软件进行支撑,它负责比如启停容器这样的事情.最广为人知的容器运行时当属Docker,但它不是唯一的.事实上,容器运行时这个领 ...
- grunt--自动化打包工具使用
用grunt搭建自动化的web前端开发环境-完整教程 jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位we ...
- D3.js:交互式操作
用户用于交互的工具一般有三种:鼠标.键盘.触屏. 1. 添加交互 对某一元素添加交互操作十分简单,代码如下: //画布大小 var width = 500, height = 500; // 在bod ...
- iOS 通知的使用
学习通知,我们要掌握:通知的发布 , 通知的监听 , 通知的移除 在通知里面,有一个非常重要的东西: 通知中心(NSNotificationCenter); 每一个应用程序,都有一个通知中心,专门用来 ...
- mongodb tip-1
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px "Helvetica Neue"; color: #454545 } p. ...
- Oracle SQL 基本操作之 用户权限管理方法
Oracle SQL 基本操作之 用户权限管理方法 最近把有关用户操作和权限管理的东西整理了一下,虽然不少博客都有过类似的整理,但是自己发现他们的内容或多或少都有些错误.于是,本人亲自对每条语句进行 ...
- [Q]手动加载菜单方法
一般情况下,安装程序会自动安装依云软件菜单,但可能由于某些原因未能自动安装的话,您可以手动加载菜单,步骤如下: 在AoutCAD命令行输入"CUILOAD",会弹出"加载 ...
- one hot encoding
转自:http://blog.sina.com.cn/s/blog_5252f6ca0102uy47.html 问题由来 在很多机器学习任务中,特征并不总是连续值,而有可能是分类值. 例如,考虑一下的 ...