DP
文章平均质量分 57
AC_0_summer
这个作者很懒,什么都没留下…
展开
-
leetcode-House Robber III-337(树形dp)
The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the “root.” Besides the root, each house has one and only one parent house. After a tour,原创 2016-08-15 14:36:05 · 1026 阅读 · 0 评论 -
!HDU 4283 屌丝联谊会-区间dp
题意:一群屌丝排队参加联谊,每个人都有屌丝值,如果他是第k个进场的,那么他的愤怒值就是(K-1)*Di,主办方想使所有屌丝的愤怒值总和最小,就用一个黑屋子来改变屌丝的进场顺序,黑屋子实际上是一个栈,先进后出。现在要求用这个栈能得到的最小的愤怒值总和是多少。分析:难点在于你不知道用了多少次黑屋子、用在哪些人身上以及每次各自进黑屋子的人数。很容易知道每个决策都会影响最终结果,那么我们就想用dp原创 2015-07-27 22:56:53 · 1040 阅读 · 0 评论 -
!HDU 1500 Chopsticks-dp-(分组问题)
题意:一种新式筷子:每副有三支,两支短的,长度差要尽可能小;一支长的,只要满足是一副里最长的就行。在n支筷子里选k副,要求每副里的短筷子的长度差总和最小分析:分组dp模型。这题跟搬寝室那题差不多,但这题的每组里多了一个长筷子,所以排序的时候从大到小,这样才能在一遍dp的时候一遍把长的选进每一组里,具体怎么实现的不要过于钻牛角尖。正如搬寝室里总结的分组模型的实现方式有两种,这里也给出两个原创 2015-07-13 19:25:58 · 1030 阅读 · 0 评论 -
HDU 1300 Pearls--dp
题意:有不同等级的珍珠,价格不同,现在列出需要买的珍珠,求花的最少的钱(可以买高等级的来代替低等级的)分析:dp[i]表示从最低等级到 i 等级花的最少的钱,dp[i]=min(dp[j]+v) v是从j+1到i全买i等级花的钱。需要三重循环。代码:#include#include#include#define INF 1000000007using namespace std原创 2015-06-14 21:51:52 · 710 阅读 · 0 评论 -
HDU 1224 Free DIY Tour--DP--(bug集锦)
题意:有多个城市编号为1到 n分别有不同的评分,现在知道了某些城市之间的直航,找一条从起点出发回到起点、沿途经过的城市总评分最大的路径。要求只能从编号低的 到编号高的,所以起点编号为1和n+1分析:dp[i]表示从1到i的最优解,dp[i]=max(dp[j]+intr[i]),其中 1这题一开始思路就是对的,不过不停WA,一路排查了各种bug,其中最重要的两个:1原创 2015-06-15 13:04:42 · 709 阅读 · 0 评论 -
!HDU 1574 RP-dp-(重点在状态确定)
题意:有n件事,每件事若发生有两种情况,增加RP为a,但是收益会减少c;减少R为a,收益会增加c。每件事能够发生的前提是小于等于或者大于等于门限值b。求最大收益。分析:这题我没找到状态,所以就不会了。又陷入了固定思维,用每件事来作为状态,然后发现找不到转移方程。应该用RP值来作为状态,状态转移就是从满足门限的RP区间的状态转移到当前状态。dp[k]表示RP值为k时的最大收益,方程:dp[i]=原创 2015-07-11 11:41:26 · 1113 阅读 · 0 评论 -
HDU 1160 FatMouse's Speed--dP--(元素1递增元素2递降的最长子序列)
题意:找到体重递增速度递降的最长序列分析:和最长递增子序列一样,不过这里先做处理:先把体重按递增排序,然后找最长递降子序列即可代码:#include#include#includeusing namespace std;struct node{ int w,s; int t;}a[2000];int n,i;struct h{ int x; int pre;}d原创 2015-06-14 15:15:18 · 687 阅读 · 0 评论 -
HDU 1159 Common Subsequence--DP--(最长公共子序列)
题意:找最长公共子序列(不要求连续)分析:二维dp肯定的,不过我自己用的四层循环,超时;正解是画矩阵,找规律。以后要多注意这种思想 WA了很多遍,原因:1.对数组边界的处理;2.while(1)超时,改成while(cin>>a>>b)就过了代码:#include#include#define max(a,b) a>b?a:busing namespace s原创 2015-06-07 15:46:03 · 837 阅读 · 0 评论 -
!HDU 1493 QQpet exploratory park-dp
题意:有61个编号从0到60的站点,其中有几个里面有宝藏,通过掷筛子的方式决定每次前进几步,只能掷10次筛子,求能走到各个有宝藏的站点的概率分析:刚开始又习惯性的想着以每个站点为状态,写了代码出来样例错了,后来想到代码里没有管筛子只能用10次的事情。画出样例的计算过程图,发现用站点作为状态不行,因为在不同的步骤里站点会有不同的概率,不能用前面的站点的总概率来求后面站点的概率,想明白后:用两原创 2015-07-12 14:46:39 · 1408 阅读 · 0 评论 -
!HDU 1494 跑跑卡丁车-dp-
题意:一圈赛道分成L段,每段有两种情况,以普通速度则获得20%能量,用加速卡则速度加速;加速卡需要100%的能量来换取。加速卡最多收集两张。求跑完m圈的最短时间。分析:dp问题还是状态搞不定。跟RP那道结合起来看吧。RP是一维,这题是二维,但是确定状态的出发点是相似的。引用一段网友的话,加深理解:“因为赛道分为L段,所以很容易想到让DP的第一维用来表示当前在第几段赛道。因为加速卡要10原创 2015-07-12 11:54:29 · 1005 阅读 · 0 评论 -
HDU 1723-Distribute Message-dp-(有向图路径模型)
题意:一队人传递消息,一个人可以向后传给m个人,求最后一个人得到消息的方式有多少种分析:dp[i]表示第i个人得到消息的方式有dp[i]种,dp[i]=dp[i-1]+.....+dp[i-m]。求方式的状态转移方程基本上都是这个样子代码:#include#include using namespace std;int n,m;int dp[100];void DP(){原创 2015-07-12 00:36:25 · 840 阅读 · 0 评论 -
!HDU 1506 Largest Rectangle in a Histogram-dp|单调队列-(dp降低时间复杂度)
题意:有宽度相同高度不同的长方体挨着放在一起,求能构成的面积最大的长方体分析:也是思维的转换。这题的主思路不是dp,dp只是起一个辅助作用。具体做法:枚举每个长方体,求以这个长方体的高度为高的最大的长方体面积,不断更新答案。用一个l[i]和r[i]数组表示第i个矩形的左右比它高的远的位置,所以面积 s=a[i]*(r[i]-l[i]+1).但是直接两重循环会超时,这时用了一点dp的思想,这里用原创 2015-06-23 01:57:34 · 779 阅读 · 0 评论 -
!HDU 4121 搬寝室-dp-(分组问题)
题意:共有n件物品,需要搬走2*k件,每次左右手各搬一件,疲劳度是(a-b)^2,求搬完k件最小的疲劳度和分析:也就是把n分成两两一组,共分k组。分组dp模型。一般都是:dp[i][j]表示前i件分成j组的最优解;然后考虑第i件物品是否被选入:1).选:dp[i][j]=dp[i-2][j-1] ;2).不选:dp[i][j]=dp[i-1][j]。综合:dp[i][j]=min(原创 2015-07-13 15:54:33 · 859 阅读 · 0 评论 -
HDU 4362 多时段多地点找龙珠-dp-(数塔模型)
题意:一个时间点在数轴的不同位置有龙珠,但每个时间点只能且必须收集一个龙珠,在不同的位置收集龙珠会损失不同的能量,移动距离也会损失能量,求m段时间后损失的最小能量。分析:就是一个数塔的dp模型,跟免费馅饼还有多时段多课问题一样。dp[i][j]:第i段时间第j的位置的最小能量损失;转移:dp[i][j]=min(dp[i+1][k]+|a[i][j].pos-a[i+1][k].pos原创 2015-08-05 21:42:59 · 1083 阅读 · 0 评论 -
!codeforces 399D Painting The Wall-概率dp
题意:有一个n*n的墙,现在小明来刷墙,如果每一行每一列都至少有一个格子刷过了就停止工作,否则每次随机选一个格子,如果刷过了就不刷如果没刷过就刷,然后休息一分钟,求停止工作时时间的数学期望(开始之前已经有m个格子刷过了)分析:概率dp状态:dp[i][j]表示还有i行j列没刷,则它能转移到的状态是dp[i][j],dp[i-1][j-1],dp[i][j-1],dp[i-1][j-1]原创 2015-07-24 15:57:07 · 985 阅读 · 0 评论 -
!HDU 4345 置换群的环长有多少种-dp
题意:置换群,问环的长度有多少种分析:环的长度就是每次你选择的区间长度的最小公倍数。总区间长度是n,那么这道题就是求和等于n的各个数的最小公倍数有多少种。状态:dp[i][j]前i个质数,区间长度不超过j的最优解转移:dp[i][j]=dp[i-1][j]+dp[i-1][j-k],k=prim[i]^1,2...这题和上一题的dp难哭我了。代码:#include#i原创 2015-08-04 22:06:22 · 843 阅读 · 0 评论 -
!HDU 4359 左子树节点和小于右子树的树有多少种-dp
题意:n个节点,每个节点的权值为2^0,2^1....2^(n-1),求满足任何节点的左子树的节点和小于右子树的节点和的分配方案有多少种分析:由于等比数列的性质:1+2+....2^(k-1)情况有:1.只有左子树,2.只有右子树,3.都有dp[i][j]:表示选i个节点深度转移:dp[i][j]+=C(i-2,k)*dp[k][j-1]*dp[i-1-k][j-1],这里用到原创 2015-08-04 21:57:34 · 1417 阅读 · 0 评论 -
!HDU 1024 Max Sum Plus Plus-dp-(分组dp?最大分段子序列和)
题意:n个数,分成m段,求这m段的最大和,段之间不能交叉。分析:这题跟最大子序列和的区别在于要求分成m段,所以做法就千差万别了。实际的做法倒有点像分组dp(将n个数分成m组),但是本题与上次写的两道分组dp(搬寝室和特殊的筷子)的不同是:上两题每组选两or三个元素,本题不确定每一段要选多少个元素;上两题先排序再做,这题只能根据序列原定顺序走。本题难点:1.状态:dp[i][j]在确原创 2015-07-18 12:09:37 · 1467 阅读 · 0 评论 -
!HDU 1078 FatMouse and Cheese-dp-(记忆化搜索)
题意:有一个n*n的格子,每个格子里有不同数量的食物,老鼠从(0,0)开始走,每次下一步只能走到比当前格子食物多的格子,有水平和垂直四个方向,每一步最多走k格,求老鼠能吃到的最多的食物。分析:矩阵上求最大子路线和,但是不像一维的最大子序列那么容易,因为二维的确定不了计算顺序;既然不能确定计算顺序,那么就可以利用dp记忆化搜索,这个正好不用管计算顺序;dp记忆化搜索的思想:递归,然后原创 2015-07-17 16:01:52 · 1075 阅读 · 0 评论 -
HDU 2084 数塔-dp-(数塔)
题意:数字排成三角形,求从顶点加到底,最大的和是多少。每个点只能加跟它直接相连的其中一个分析:数塔是经典的dp模型,从底往上推,每次找最大的往上一层加,最后归总到顶点,结果就是顶点的值。dp[i][j]:加到dp[i][j]第i行第j个数时的最大和;dp[i][j]=dp[i][j]+max(dp[i+1][j],dp[i+1][j+1])代码:#include#define原创 2015-07-17 13:55:25 · 828 阅读 · 0 评论 -
!HDU 4293 排队分组说谎问题-dp-(不相交区间的最大个数)
题意:一群人排队回家,分成很多不同的小团体,现在每个人都说一句自己的团体前面和后面分别有多少人,有些是真话有些是假话,求最大可能说真话的人数分析:最大可能说真话的人数也就是求不冲突的信息最多有多少。一个人说的他的团队前面有多少人后面有多少人,就可以知道他的团队有多少人(有可能是假话)。这道题画出示意图很关键,数轴表示法mark,这个博客的数轴图就很直观,不过最后一组有点问题,应该有原创 2015-07-28 07:16:05 · 1408 阅读 · 0 评论 -
HDU 4175 多时段多课最小能量消耗问题-dp-(数塔模型)
题意:有c个时段的课,每个时段有t种课,每种课对应一个能量消耗值,从一节课转移到另一节课移动的距离为n,则移动消耗的能量也是n,现在小明要上课,他全时段的课都要上,同一时段只能选一种课,并且一天结束之后还要赶到L的位置,求他的最小能量消耗。分析:数塔模型,从后往前推;三重循环。20*25*1000*1000不会超时(20是tests)。为什么是数塔模型呢,因为分成了c段,每段必须选且只能选原创 2015-07-28 23:08:46 · 1018 阅读 · 0 评论 -
POJ 1458 Common Subsequence-dp-(最长公共子序列模型)
题意:裸最长公共子序列分析:直接套用模型,注意初始化和实现的是细节代码:#include#include#include#define max(a,b) a>b?a:busing namespace std;int dp[1010][1010];string a,b;int main(){ while(cin>>a>>b){ for(int i=0;i<a.l原创 2015-07-14 14:51:58 · 903 阅读 · 0 评论 -
HDU 2191--DP--(多重背包)
题意:汶川地震买大米分析:裸多重背包,这题数据比较小所以可以三重循环不需要优化代码:#include#includeusing namespace std;int dp[1000][1000],t,n,m;int p[1000],h[1000],c[1000];int max(int a,int b){ return a>b?a:b;}int main(){ ci原创 2015-06-09 15:46:31 · 1468 阅读 · 0 评论 -
!HDU 1074 Doing Homework--DP--(状态压缩)
题意:n个作业,每个作业有deadline和做完这个作业需要花的时间cost,完成作业每超过一天就减一分,求减去的最小的分数分析:作业的全排列中取最优解,但是15!太大了会超时,所以用二进制来状态压缩,15个二进制位,第i位的0/1代表第i个作业是否完成。1.会用状态压缩2.保存和输出最优解序列方法慢慢加深理解吧代码:#include#include#include#原创 2015-06-07 00:27:53 · 825 阅读 · 0 评论 -
!HDU 1158 Employment Planning--DP--(二维)
题意:列出每个月需要的员工数,已知每月工资、以及雇佣和开除员工的额外费用,求最小的预算。(只要员工不被开除就拿工资)分析:开始我想的一维dp,结果在找状态转移方程的时候发现有很多情况要讨论,所以我就认为这题应该是一个贪心题,在准备打代码的时候发现贪心不能得出最优解,所以我就去搜题解了,原来是二维dp。记住一维要分很多情况的要用二维。 dp[i][j]表示第i月用j个员工时前i月的原创 2015-06-07 13:34:51 · 781 阅读 · 0 评论 -
hdu 1257--dp/贪心
题意:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。请帮助计算一下最少需要多少套拦截系统。分析:贪心或者dp都可以。dp[i]表示拦截第i个导弹需要的最少的系统个数,dp状态原创 2015-05-29 21:02:19 · 490 阅读 · 0 评论 -
hdu 1355--似乎并不是dp
题意:一个二维数组上有些值为0,有些值不为零,一个人从数组外进入数组取这些值,但是必须从大到小拿,每走一步要一单位的时间,取数也要一单位的时间,进入数组和出数组分别要一单位的时间。求在规定的时间内能取到的最大的值(开始在数组外,需在规定的时间内返回数组外)。分析:我并不知道这题跟dp有多大的关系。做法是把数组从大到小排序,然后遍历这些值,每次计算若取走这个值还剩下的时间,如果剩下的时间不足以返原创 2015-05-30 01:22:32 · 1013 阅读 · 1 评论 -
!hdu 1203--dp--(加深理解)
题意:小明有n元钱,他想申请国外的学校,申请第i所学校要用si的费用,申请成功的概率是pi,求小明至少能申请成功一所学校的概率。分析:概率当然是从反面求最小值。状态转移方程:dp[i]=min(dp[j]*p[i],dp[i]),我想错了,我就按照以前的dp的套路依照数组来遍历,还先排了序,dp[i]代表申请第i所学校时的最优解;正确的应该是从费用出发,dp[i]表示用了i元钱时的最优解,这才原创 2015-05-29 00:18:55 · 1214 阅读 · 2 评论 -
HDU 1080 Human Gene Functions--DP--(最长公共子序列变形)
题意:两端基因序列匹配,四种不同的核苷酸TCGA匹配时有不同的分数,如T—G的分数是-2,还可以添加空格,空格与核苷酸匹配也有相应的分数,求最大的分数分析: 难点在空格的数量和位置不确定 二维dp,dp[i][j]表示序列a的前i段和序列b的前j段匹配时的最大分数。接下来仔细分析当i和j匹配的情况:1.a[i]与b[j]匹配;2.a[i]与b[j-1];3.a[i]原创 2015-06-08 15:32:09 · 815 阅读 · 0 评论 -
!HDU 1243 反恐训练营--dp--(最长公共子序列)
题意:给你一个子弹序列和恐怖分子序列,只有子弹打到对应序号的恐怖分子才能得分,每个恐怖分子有对应的分数,求最大的得分分析:这题抽象出来的模型就是最长公共子序列,直接套公式:dp[i][j]表示用第i颗子弹打第j个恐怖分子时能得到的最大分数,注意这指的是从开始状态到这一状态这个过程的最优解,而不是这一状态的最优解;状态转移:1.当a[i]==b[j]时,dp[i][j]=dp[i-1][j-1]原创 2015-06-16 00:28:02 · 1142 阅读 · 0 评论 -
HDU 1422 重温世界杯--(最长子序列模型,bug)
题意:按照输入的城市序列的顺序环游世界,每个城市有补助和花费,如果补助大于花费,你可以保存剩下的钱以后还能用,如果补助加上你保存的钱小于花费则停止旅游。求最多能去多少城市分析:这题跟求最长子序列差不多,dp[i]表示走第i个城市时最多经过的城市的数量,如果第i个城市的花费够用那么 dp[i]=dp[i-1]+1,复杂度是 O(n) 这题主要卡在:1.TLE.原因是输入输出用原创 2015-06-17 10:54:46 · 1048 阅读 · 0 评论 -
HDU 1087--DP--(水)
题意:有一数轴,中间有n个具有不用权值的点可以走,每一步只能从权值低的跳到权值高的点,求从起点走到终点能收集到的最大的权值。分析:基础的dp. dp[i]代表走到i点时收集到的最大权值。状态转移方程:dp[i]=max(dp[j]+a[i],dp[i]) 其中 j代码:#includeusing namespace std;int n,a[1001];long long dp原创 2015-05-27 23:21:56 · 1264 阅读 · 0 评论 -
HDU 1003--DP(最大子序列和)
题意:一组数列,求子序列和的最大值以及首末位置。分析:dp,转移方程是:dp[i]=max(dp[i-1]+a[i],dp[i]) 这里要求记录序列的位置所以dp设为二维数组,dp[0]用来记录首位置,末位值就是i,首位置用dp应该是这样的:如果发生了上面的状态转移则dp[i][0]=dp[i-1][0] 注意:如果有多种答案,输出第一种。所以最好i从1原创 2015-05-26 20:32:57 · 913 阅读 · 0 评论 -
HDU 1069--DP--(摞箱子问题)
题意:有n中箱子,可以任意选择它的面作为底面,只有当底面的长和宽严格小于下面的箱子时才能放在下面的箱子上。求用这n种箱子能摞的最高的高度(每种箱子的个数不限)。分析:dp 转移方程:dp[i]=max(dp[j]+a[i],dp[i]),j 从 0 到 i-1,在计算状态转移方程之前先判断箱子的长宽是否满足条件。预先要按照能摞的条件把箱子排序,然后dp;注意每种箱子有三种放置方式,相当于有三种原创 2015-05-26 23:25:56 · 1337 阅读 · 0 评论 -
!HDU 1176--DP--(矩阵动规)
题意:有一个数轴,从0到10,小明开始在5这个位置。现在天上开始掉馅饼,小明每次只能移动单位一的长度,求小明最多能接到多少馅饼。分析:刚开始接触动态规划,还没有真正理解动规的思维,所以刚开始的dp做法不知道对不对但是TLE了。正确的方法是建立一个以时间为行位置为列的矩阵,最初map[i][j]代表的是第i时刻j位置掉的馅饼的数量,状态转移方程:map[i][j]=map[i][j]+max(m原创 2015-05-27 19:31:16 · 1157 阅读 · 0 评论 -
HDU 1331--DP--(递归保存中间结果)
题意:题目给出了递归计算式,让你编程用这个计算式求出结果。分析:递归会超时,用DP保留中间结果。DP不光是只有状态转移方程还可以用于递归保存中间结果以节约时间。代码:#include#includeusing namespace std;int dp[100][100][100];int DP(int a,int b,int c){ if(a<=0||b<=0||c<原创 2015-05-31 12:18:36 · 1726 阅读 · 0 评论 -
HDU 1081 To The Max--DP--(最大子矩阵)
题意:输入一个二维数组,求和最大的子矩阵分析:一看到和最大的子XX,我就联想到和最大子序列,只不过那是一维这是二维,所以做法都差不多。把二维压缩成一维:你想啊一个矩阵的和不是可以先垂直方向相加把所有行压缩为一行然后这一行相加嘛。压缩过后找最大和的方法跟一维一模一样。但我自己做的时候写了四个循环,唉.....数组可以存放之前求过的和,那么求以下一行为结尾的和的时候只要在原来的数组上加这一行的数就原创 2015-06-10 20:40:20 · 865 阅读 · 0 评论 -
HDU 1114 Piggy-Bank--DP--(裸完全背包)
题意:有n种硬币可放进存钱罐,已重量知每种硬币的重量和价值,又知存钱罐的重量为e和装了硬币之后的重量为f,求存钱罐里最少有多少钱分析:模型就是完全背包,跟求用的最少的n种面值不同的钱凑成s元一样,就是求在总重量(f-e)一定的情况下这些硬币最少能凑 多少钱dp[i]表示重量为i的时候最少的价值,状态转移方程:dp[i]=min(dp[i],dp[i-w[j]]+p[i]),其中i>=w[j原创 2015-06-07 10:38:33 · 822 阅读 · 0 评论 -
HDU 1058 Humble Numbers--DP--(计数器技巧)
题意:输出第n大的质因数只有2,3,5,7的数分析:预处理满足这些条件的数,然后输出dp[n]就行,满足条件的数无非就是2,3,5,7不断的做乘积这题的关键就是如何把这些乘积从小到大存入数组:设置四个计数器p2,p3,p5,p7完成这个任务代码:#include#include#define min(a,b) (a<b?a:b)using namespace std;int原创 2015-06-06 22:43:52 · 935 阅读 · 0 评论