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的更多相关文章

  1. hdu5009 Paint Pearls (DP+模拟链表)

    http://acm.hdu.edu.cn/showproblem.php?pid=5009 2014网络赛 西安 比较难的题 Paint Pearls Time Limit: 4000/2000 M ...

  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 (动态规划)

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

  4. hdu5009 Paint Pearls[指针优化dp]

    Paint Pearls Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  5. AC日记——Paint Pearls hdu 5009

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

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

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

  7. 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 ...

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

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

  9. HDOJ 5009 Paint Pearls

    Dicripntion Lee has a string of n pearls. In the beginning, all the pearls have no color. He plans t ...

随机推荐

  1. pb_ds(平板电视)整理

    有人说BZOJ3040用普通的<queue>中priority_queue搞dijkstra过不了. 我只想说你们的djk可能写的太丑了. 先上代码 #include<iostrea ...

  2. 驱动07.USB驱动程序

    1 了解USB识别的过程 eg:在Windows系统下的一个现象:把手机的USB设备接到PC 1. 右下角弹出"发现android phone" 2. 跳出一个对话框,提示你安装驱 ...

  3. SQLite 约束

    约束是在表的数据列上强制执行的规则.这些是用来限制可以插入到表中的数据类型.这确保了数据库中数据的准确性和可靠性. 约束可以是列级或表级.列级约束仅适用于列,表级约束被应用到整个表. 以下是在 SQL ...

  4. jxl 导入excel

    jsp部分 <div class="modal-dialog"> <div class="modal-content"> <div ...

  5. 试制品 (nyoj 542)

    模拟 a 反应物集合 ; b 生成物集合; c 存在的化合物或单质集合; ans 新生成化合物集合 1.如果反应无均在已生成的化合物集合中,则完成反应,将合成物加入c集合 2.对每个方程式的反应物进行 ...

  6. __builtin_expect

    今天在看内核代码中看到: #define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), ...

  7. Ubuntu安装Python机器学习包

    1.安装pip $ mkdir ~/.pip $ vi ~/.pip/pip.conf [global] trusted-host=mirrors.aliyun.com index-url=http: ...

  8. System.Data.DbType和数据库映射关系

    有如下类型的映射对照: System.Data.SqlClient.SqlDbType  System.Data.OleDb.OleDbType System.Data.Odbc.OdbcType S ...

  9. CSS3之3D效果中的transform运用

    css3中添加了很多新的标签 属性 描述 css transform 向元素应用 2D 或 3D 转换. 3 transform-origin 允许你改变被转换元素的位置. 3 transform-s ...

  10. DB2导入导出 学习笔记

    db2pd -osinfodb2mtrk -i -d (for aix)db2 get dbm cfg show detaildb2 get db cfg show detaildb2 get sna ...