DP其实也是和搜索一样可以有剪枝的,昨晚看到一个超级好的DP剪枝题:(HDU - 5009)

N段东东,要染色,每次给一个区间染色需要的花费为  该区间颜色总数的平方。  每一段只能被染一次色。求 最少花费将所有区间染色。 N<=500000;

这题也是很容易想到方程:F[j] 表示前i段的最小花费,F[j]=min{F[k]+sum[k+1][j]} (k<i) 。  复杂度为O(N^2),但是数据范围大的BT。。所以需要优化。而本题貌似没法用一个辅助数组来草。。所以需要从题目本身的限制条件出发找到优化。

优化A:首先对于一个长度为len的区间,我每次只染一小段,也只要len^2的花费,所以转移的时候,当k不断减小时,颜色也越来越多,当颜色的总数为cnt时,最后一次染色的花费是cnt*cnt,显然如果cnt*cnt>=i的话,还不如直接每次只染一小段,所以循环就可以停止了。

优化B:比如数据3 4 2 4 4 2 4 3 2 2。 现在要求F[9],当k减少到6的时候,最后一次染色的区域是[4 3 2 2]。有3种颜色,那就太亏了。因为之前是[3 4 2 4 4 2],这些如果跟着一起涂,那么仍然是3^2的代价,但前面的数字变少了,显然这种更优。。  所以 假设 求F[i]的时候, 前面的颜色为 [ [...]z x y x] ,那么 k枚举到左边那个x 的位置的时候,肯定还不如最后一次把那个x也一起涂掉,也就是肯定不比k枚举到z的时候优。。所以就可以把左边那个x给删掉,具体删除的话就用一个双向链表。也就是如果有多个x,只要保留最右边的那个x就可以。

优化的核心代码:

         dp[] = , pre[] = -;
for (int i = ; i <= n; i++) {
if (!mp.count(a[i])) mp[a[i]] = i;
else {
int id = mp[a[i]];
nxt[pre[id]] = nxt[id];
pre[nxt[id]] = pre[id];
mp[a[i]] = i;
} int cnt = ;
for (int j = pre[i]; j != -; j = pre[j]) {
cnt++;
dp[i] = min(dp[i], dp[j] + cnt * cnt);
if (cnt * cnt > i)
break;
}
}

可以参考代码出处http://www.2cto.com/kf/201410/340390.html

DP 剪枝的更多相关文章

  1. [POJ3612] Telephone Wire(暴力dp+剪枝)

    [POJ3612] Telephone Wire(暴力dp+剪枝) 题面 有N根电线杆,初始高度为h[i],要给相邻的两根连线.可以选择拔高其中一部分电线杆,把一根电线杆拔高\(\Delta H\)的 ...

  2. cf298F:状压dp+剪枝

    div2的F题,只想到了一个复杂度略高的dp,T了几次,后来加了剪枝减掉一些无用的状态终于过了.. 题意: 一个n*m的矩阵 (n<=5,m<=20),对格子进行黑白染色,已经给出了每行每 ...

  3. 深搜+DP剪枝 codevs 1047 邮票面值设计

    codevs 1047 邮票面值设计 1999年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description ...

  4. Atcoder Typical DP Contest S - マス目(状压 dp+剪枝)

    洛谷题面传送门 介绍一个不太主流的.非常暴力的做法( 首先注意到 \(n\) 非常小,\(m\) 比较大,因此显然以列为阶段,对行的状态进行状压.因此我们可以非常自然地想到一个非常 trivial 的 ...

  5. POJ 3184 DP+剪枝

    思路: 先找到每i头奶牛能在的位置 (一段区间) 记为L[i]和R[i] f[j]表示在位置j取到的最小值 每回在范围内更新一哈 //By SiriusRen #include <cstdio& ...

  6. 【最大团】【HDU1530】【Maximum Clique】

    先上最大团定义: 最大团问题(Maximum Clique Problem, MCP)是图论中一个经典的组合优化问题,也是一类NP完全问题,在国际上已有广泛的研究,而国内对MCP问题的研究则还处于起步 ...

  7. LeetCode 363:Max Sum of Rectangle No Larger Than K

    题目链接 链接:https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/description/ 题解&代码 1 ...

  8. 2019.3.12考试&2019.3.13考试&ESTR

    过程:太菜了,不写了 T1 基环树直径,一定学 T2 树上斜率优化,类似购票,数据结构/分治算法,一定改 (把点按深度排序倒着跑2e7次斜率优化也能A,orz zyz) T3 CC原题,码码码,一定补 ...

  9. AC日记——Paint Pearls hdu 5009

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

随机推荐

  1. MVC中Html.Listbox的用法实例

    要绑定listbox或dropdownlist前提是:必须是SelectItem类,例如: 因为Html.ListBox第二个绑定数据的参数要得类型为SelectList第一种:因为listbox可以 ...

  2. thinkphp分页效果的制作,按查询条件分页正确做法

    PHP代码: <?php namespace Home\Controller; use Think\Controller; use Home\Clas\Cate; class IndexCont ...

  3. 新建我的 第一个maven项目

    maven是管理项目的,myeclipse是编写代码的.第一次写项目都要配置好多东西,很麻烦,now 来看看怎样新建一个maven项目. 百度经验:jingyan.baidu.com 工具/原料   ...

  4. java技术知识点

    1   自我介绍 2  做过的项目 (Java 基础) 3  Java的四个基本特性(抽象.封装.继承,多态),对多态的理解(多态的实现方式)以及在项目中那些地方用到多态 Java的四个基本特性 ◦  ...

  5. spring mvc获取request HttpServletRequest

    1.最简单的方式(注解法) 2. 直接的方法,参数中添加(response类似) package spittr.web; import static org.springframework.web.b ...

  6. iOS开发 返回字符串的宽高

    - (CGFloat)achiveWidthWithHeight:(CGFloat)height Font:(UIFont *)font { CGSize size = [self boundingR ...

  7. NDK与JNI

    什么是NDK(android native develop kits) :android 本地开发工具集,可以把c/c++编译成一个linux下可以执行的二进制文件 java代码里面就可以通过jni ...

  8. 为什么删不掉date模块

    显示是field pending deletion一看report里面的field list并没有xxx_date_xxx,只好跑到数据库才看到一个field_date_test当时并没有把这个字段当 ...

  9. ogre入门笔记

    ogre作为一款开源的非商业渲染引擎, 除去效率不谈, 其设计结构十分优雅, 值得游戏从业者拥有和学习.本篇笔记基于ogre v1.9. 1.代码模块 ogre的核心代码分布如下图: ogreMain ...

  10. 为设计师准备的 20 个新的免费 PSD 模板

    设计师们每天的工作经常要用到各种模板,本文推荐 20 个新的免费 PSD 模板,可节省设计时间. Blueprint Notice PSD Wooden Drawer Icon Minimal Clo ...