
ACM_DP
文章平均质量分 76
cookiesMonster
这个作者很懒,什么都没留下…
展开
-
POJ 3211 washing clothes (01背包)
题意:两个人洗最多n种颜色的衣服,最多洗m件,他们必须先洗完一个颜色的衣服再去洗另一个颜色的衣服,给出没见衣服要洗的时间和它的颜色,求他们把衣服洗完所需的时间。思路:我一开始没觉得是背包问题,觉得可以用贪心做,然后wa了。要洗衣服总时间最短即洗每种颜色的时间最短,对于每种颜色的衣服,希望两个人洗衣服的时间尽量相差较小,先求用时较少的人最多洗多久(不超过该颜色总时间的一半,即容量),该颜原创 2015-02-04 21:31:44 · 380 阅读 · 0 评论 -
POJ 2282 The Counting Problem (数位dp)
题目:http://poj.org/problem?id=2282题意:求出数a-b之间(0 ),出现的0,1...9的个数。思路:用数位dp记忆化搜索模版。代码:#include #include #include #include #define MOD 1000000007#define INF 0x7fffffffusing namespace std;typ原创 2015-09-05 20:34:19 · 360 阅读 · 0 评论 -
ZOJ 3623 Battle Ships (完全背包)
题意:敌人的防御塔有一定是生命值l,我方有一个工厂,可以制造n种战船来攻击防御塔,但每秒内只能有一只战船正在被建造,给出每种战船需要的建造时间t和它们建好后每秒可以造成的防御塔生命值减少量ll,求我方最少在第几秒可以摧毁防御塔(生命值为思路:容易想到对于每一秒如果选择建造某种战船,需要比较不建造和建造时 t 时间后的对防御塔攻击的总量(即ans[j + t]),但比较难想到建造时 t原创 2015-02-05 09:49:04 · 396 阅读 · 0 评论 -
HDU 3652 B-number (数位dp)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3652题意:求数1-n中,包含序列“13”且能被13整除的数的个数。思路:用数位dp记忆化搜索模版。代码:#include #include #include #include #define MOD 1000000007#define INF 0x7fffffffusing n原创 2015-09-05 20:51:31 · 254 阅读 · 0 评论 -
POJ 2063 Investment (完全背包)
题意:我有很多钱,要用来买债券,已知每种债券的价格和每一期可获得的利润(注意债券的价格只能为1000的倍数),而且我可以每一期把原来的债券卖掉,然后用原来的钱加上利润选择新的购买方案。已知我要一开始有多少钱和我将购买多少期债券,求出我最后有多少钱。思路:完全背包。一开始看到债券价格为1000的倍数,我就用了for(int j = value[i]; j ……str += a原创 2015-02-05 09:15:27 · 660 阅读 · 0 评论 -
HDU 3555 Bomb (数位dp)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3555题意:求出1到N (1 思路:使用记忆化搜索模版的数位dp。代码:#include #include #include #include #define MOD 1000000007#define INF 0x7fffffffusing namespace std;typ原创 2015-09-05 20:20:11 · 238 阅读 · 0 评论 -
POJ 3252 Round Numbers (数位dp)
题目:http://poj.org/problem?id=3252题意:对于一个数,如果它的二进制表示数中,出现的0不少于1,则满足条件。求数s到e之间满足条件的数的个数。思路:用数位dp记忆化搜索模版。一开始用sta表示0出现的次数减1出现的次数,sta会为负,数组访问时出错。代码:#include #include #include #include #define M原创 2015-09-05 21:22:39 · 258 阅读 · 0 评论 -
HDU 1693 Eat the Trees (插头dp)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1693题意:这是一道插头dp的入门题给出一个n*m的地图,标记为1的格子上有树,有个英雄要吃掉所有的树,吃树的时候要遵循规则:1)一圈一圈地吃(只能走上下左右,每个圈至少4个格子,头尾相连);2)只能走有树的格子,吃过的树就消失了,即圈不能相交,每个格子只能走1次;3)可以分成几个圈原创 2015-09-15 15:12:12 · 354 阅读 · 0 评论 -
概率dp入门[HDU5001][POJ2151][POJ3071][HDU3853][POJ2096]
[HDU5001][POJ2151][POJ3071][HDU3853][POJ2096]概率分为求概率和求期望两种:求概率从起点开始求解,因为起点发生的概率通常可以确定,为1;求期望从终点开始求解,因为通常记录从某个点到终点的期望,即先确定了终点到终点的期望。例题HDU 5001 概率 http://acm.hdu.edu.cn/showproblem.php?pid=5001题意:有一个图,n个点,m条边,(起点随机)我在某个点随便找一条相邻边消耗1原创 2015-09-14 21:58:07 · 415 阅读 · 0 评论 -
HDU 5000 Clone (多重背包)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5000题意:有一个人他可以克隆自己, 但克隆出来的自己并不完全一样。对于每两个自己,A和B,他会看n个属性,如果B的每一项属性都比不过A,那么B就不能存在。每一个属性的评分范围为0-t [ i ],问最多能存在多少个他自己。思路:对于可以同时存在的两个人,假如有3个属性a1 + b1原创 2015-09-14 20:38:09 · 403 阅读 · 0 评论 -
单调队列优化dp [HDU2191][HDU3401][POJ1821]
用单调队列优化形如 dp[i][j] = max(dp[i - 1][k] + (j - k) * a[i]) 的状态转移上式可化为dp[i][j] = max(dp[i - 1][k] - k * a[i]) + j * a[i],在不用单调队列优化前,对于dp[i][j] 和dp[i][j + 1]枚举 k 时发现,有重复的部分,而且都是取dp[i - 1][...k...]...的最原创 2015-10-05 22:13:15 · 472 阅读 · 0 评论 -
HDU 2126 Buy the souvenirs (01背包)
题意:我有m元,有n个纪念品,已知它们分别的价格,输出我最多能买多少个不同的纪念品,以及能买到最多不同纪念品时我可选择的方案数。思路:将m作为容量,纪念品的价格作为消耗,每个纪念品的价值为1(件),容易求得我最多能买的纪念品数。用一个数组s记录方案数。#include int main(){ #ifdef LOCAL freopen("data.in"原创 2015-02-04 21:48:33 · 330 阅读 · 0 评论 -
HDU 5416 CRB and Tree (树形dp)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5416题意:给出一棵树和每条边的权值,f(u,v) 表示结点u到结点v之间路径上所有边异或运算的结果,q次询问,每次问f(u,v)=s的路径有多少条,u可以等于v。代码:#include #include #include using namespace std;typedef long原创 2015-09-05 22:12:57 · 266 阅读 · 0 评论 -
POJ 3286 How many 0's? (数位dp)
题目:http://poj.org/problem?id=3286题意:求n-m之间的数含有的0的个数。思路:用数位dp记忆化搜索模版。代码:#include #include #include #include #define MOD 1000000007#define INF 0x7fffffffusing namespace std;typedef long l原创 2015-09-05 20:42:00 · 284 阅读 · 0 评论 -
HDU 1059 POJ 1014 Dividing (多重背包)
题意:两个人一起收集了有价值为1、2、3、4、5、6的宝石,数量分别为n1,n2...n6,求他们是否能分配宝石使两个人获得的宝石总价值相等。思路:在知道了要进行二进制转换之后,我先对不同价值的宝石进行了二进制转换,再处理01背包问题,结果还是TLE,看了网上的题解,对比之后发现还需要在每次对一种价值宝石进行二进制转换的同时进行01背包的求解。{优快云:CODE:59原创 2015-02-04 22:12:37 · 349 阅读 · 0 评论 -
POJ 1276 Cash Machine(多重背包)
题意:有一个钞票机,里面有N种面额的钞票d1,d2...dn各n1,n2...n3,如果我要cash元,问它最多能给吐我多少钱(它吐出的钱数不会大于我的需求)。思路:多重背包。但在一开始的时候只是简单地加一个循环,然后for(int i = 0; i for(int j = 0; j for(int k = 0; k dp[k] = max(dp[k], dp[k -原创 2015-02-04 21:51:31 · 335 阅读 · 0 评论 -
区间dp入门[POJ2955][HDU2476][POJ3186][POJ1651][HDU4632][HDU4283][HDU4570][POJ3280]
[POJ2955][HDU2476][POJ3186][POJ1651][HDU4632][HDU4283][HDU4570][POJ3280]区间dp问题,通常给出一个序列,用dp[ i ][ j ] 表示序列为ai,a(i + 1)...aj时的答案,而较长的序列的答案由较短的序列的答案递推得到,让人想到矩阵连乘顺序问题。所以解题的时候会用到3个循环:第一层枚举序列长度 jj;第二层枚举序列开头的位置 i ;第三层枚举序列 [i, i + jj ] 中间点 k,其中第三层有时是不需要的.原创 2015-08-15 17:32:59 · 415 阅读 · 0 评论 -
HDU 1114 Piggy-Bank (完全背包)
题意:知道储钱罐里的硬币重量和各种面值硬币对应的重量,若能确定其中硬币的最小总价值,输出最小总价值,否则输出This is impossible.思路:需要注意最小总价值时硬币重量是否与已知相等的判断。#include int p[510], w[510];int ans[10010];int main(){ #ifdef LOCAL freope原创 2015-02-04 22:31:20 · 416 阅读 · 0 评论 -
状态压缩dp入门[HDU1074][HDU1065][POJ3254][POJ1185][HDU4359][POJ3311][POJ2411]
[HDU1074][HDU1065][POJ3254][POJ1185][HDU4359][POJ3311][POJ2411]我理解的状态压缩dp问题是这样的:给出你n个物品,你要在这n个物品中选出一些物品(或一个都不选),那么对于每个物品你都有两种选择(选或者不选),这样,一共有2^n种情况。而n如:总共有5个物品,则最多有32种取物品的情况,13 对应5位的二进制数01101,就表示取物品2,3,5。对于每个5位的二进制数我们都用5次位运算判断它的各个位是1还是0。本来每个状态要用5个空间存,现在原创 2015-08-14 22:25:25 · 531 阅读 · 0 评论 -
经典动态规划问题 背包问题 [POJ3211][POJ2063][HDU1114][POJ1276][POJ1014][POJ1742][ZOJ3631]
[POJ3211][POJ2063][HDU1114][POJ1276][POJ1014][POJ1742][ZOJ3631]最长上升自序列问题(LIS)给出n个整数a1,a2...an组成序列,求最长的上升子序列(若i时间复杂度为O(n^2)的做法:dp[i]表示以ai为末尾的最长上升子序列长度,则有 当a[j] 时间复杂度O(nlogn)的做法:dp[i]表示长度为i的上升子序列末尾元素的最小值,则对于每个元素ai,二分查找数组dp,找到第一个dp[]值不小于ai的位置,将其值变为ai例题原创 2015-08-14 15:52:58 · 537 阅读 · 0 评论 -
树形dp入门[POJ1655][HDU1520][HDU1561][HDU1011][POJ1155][ZOJ3626]
[POJ1655][HDU1520][HDU1561][HDU1011][POJ1155][ZOJ3626]树形dp中,我们可以很容易利用题目给出的数据构建出一棵树,然后我们会用dp[i]记录,选择以 i 为根的子树中的点能得到的最优答案。而dp[i]的值可以根据,i节点的子节点u1,u2...un对应的dp[u1],dp[u2]...dp[un],递推得到。树形dp通常用搜索的形式实现,由于是树的结构,所以不包含重复的搜索,复杂度为O(n)。原创 2015-08-15 21:46:01 · 593 阅读 · 0 评论 -
ZOJ 3626 Treasure Hunt I (树形dp)
题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3626题意:有一个危险的村庄,这里有时会有怪兽出现,已知怪兽多久会出现一次,怪兽出现之后发现谁不在家,就会把谁杀掉。一个勇士要得到了一张藏宝图并要去找宝藏,他知道村庄之间的距离和每个村庄里有多少宝藏,问他不被怪兽杀掉的话,最多能拿到多少宝藏。给出的n个村庄和n-1条原创 2015-08-16 12:02:54 · 439 阅读 · 0 评论 -
HDU 5396 Expression (区间dp)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5396题意:给出n个数,每相邻的两个数之间有一个运算符号,“+”, “-” 或 “*”,你进行n - 1次操作,每次操作选出一个符号c和它左右的两个数a和b,计算出 M = a c b,将得到的数代替 a c b 得到新的式子,直到最后式子为一个数。求按不同顺序选择符号得到的数的和。思路:dp[原创 2015-08-18 21:54:13 · 314 阅读 · 0 评论 -
HDU 4389 X mod f(x) (数位dp)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4389题意:对于一个数x,先求出各位数之和 f(x),如果 x mod f(x) 等于0,则满足条件。求出数n到m中满足条件的数的个数。思路:用数位dp记忆化搜索模版。代码:#include #include #include #include #define MOD 1000000原创 2015-09-05 21:11:12 · 303 阅读 · 0 评论 -
codeforce #331D Wilbur and Trees (记忆化搜索DP)
题目:http://codeforces.com/contest/596/problem/D题意:有n课树并排排列,没课树高h,砍树。每次,从剩余的树中选最左边的或最右边的(概率相等,0.5),砍掉一棵树,树倒向左边的概率为p,倒向右边的概率为1-p。如果树和相邻树的距离小于h,树倒时会把相邻的树撞倒。问,砍完所有树,树干覆盖的草地长度的期望值。思路:dp[ l ][ r ] 表示看完原创 2015-11-24 20:16:54 · 442 阅读 · 0 评论