自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

关于学习本身

很久不在

  • 博客(24)
  • 问答 (1)
  • 收藏
  • 关注

原创 HDU 1692 Destroy the Well of Life-卡时间-(枚举+剪枝)

题意:有n口井,编号为1到n,打破第i口井需要p[i]的能量,但是只要井被打破里面的水会流到下一口井,只要一口井的井水w[i]多余一个上限l[i]会自动打破,求打破第n口井需要的最少的能量分析:hdu 把它归为dp,想了一会发现找不到最优子结构,然后看题解——根本不是dp,只是一个剪枝的题。或许有dp的解法,如果哪位大知道还请指教。解题思路一旦局限在一个框框内很危险啊代码:#inclu

2015-06-25 16:14:37 972

原创 HDU 1712 ACboy needs your help-dp-(分组背包模型)

题意:n门课程用m天来学习,每门课用不同的天数来学习会有不同的学分,求能得到的最大的学分分析:第一次接触分组背包。分组背包的模型就是不同的物品有不同的花费和价值,求在规定花费内能得到的最大的价值,这前面跟以前的背包最大的不同是物品分为几组,每组内的物品最多只能选一种;dp[i][j]表示前i组花费j能得到的最大的价值,不过实际在做的时候用一维数组就可以了公式:for 组i    f

2015-06-23 22:35:18 816

原创 HDU 1505 City Game-dp-(最大子矩阵模型)

题意:求最大的子矩阵分析:直接用最大字矩阵的公式做超时了。换个思路,这题跟上一题1506有关系,先以每层为底算出每个元素能到达的最大的高度,然后就跟1506一样了。这里求高度和求面积两处地方用到了dp暂存数据。求高度用二重循环,然后每层为底求面积要二重循环加上外层就是三重循环,但是由于用了dp保存中间结果,所以这个三重循环不会超时。dp[j]表示当前层第j列能到达的最大的高度,状态转移:1.a

2015-06-23 02:48:45 887

原创 !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 773

原创 HDU 1559 最大子矩阵--dp--(最大和子矩阵模型)

题意:给定一个矩阵,求一个宽为a,长为b的子矩阵的最大和分析:直接用最大和子矩阵的公式,只是这里多了一个限制条件,所以在求和的时候稍有点不同,就是不逐行和逐列求了而是每次以a,b为跨度来求dp[k]=mt[i][k]+....+mt[i+a][k],然后每次求sum=dp[k]+.....+dp[k+b],mx=max(mx,sum)代码:#include#includeusi

2015-06-22 15:43:08 994

原创 !HDU 1513 Palindrome--dp--(最长公共子序列模型)

题意:给定一个字符序列,求最少添加多少个字符能让它变成对称序列分析:这题的做法竟然是把序列颠倒之后求最长公共子序列,然后n-dp[n][n]就是答案。记住这种做法。         在这里再说一次最长公共子序列的做法:dp[i][j]表示序列1的前i个字符和序列2的前j个字符比较时的最长公共子序列的长度,状态转移公式:1.当a[i]==b[j]时,dp[i][j]=dp[i-1][j-1]

2015-06-21 20:16:20 819

原创 HDU 1337 The Drunk Jailer--(模拟题找规律)

题意:有n个监狱,共n轮,第 i 轮警察会去编号为 i 的倍数的监狱,如果是锁的就开锁,如果是开的就锁上,求n轮过后有多少犯人会逃出来分析:这题实际上是个模拟题,因为数据很小我直接用两重循环模拟的,如果数据很大的话,就不能直接模拟了,模拟题卡时间多半是找规律。          这题的规律是:如果一个监狱被查看了偶数次的话相当于则什么都没发生,还是锁的,也就是说找没有锁上的监狱只要n以内找

2015-06-17 11:22:53 990

原创 HDU 1422 重温世界杯--(最长子序列模型,bug)

题意:按照输入的城市序列的顺序环游世界,每个城市有补助和花费,如果补助大于花费,你可以保存剩下的钱以后还能用,如果补助加上你保存的钱小于花费则停止旅游。求最多能去多少城市分析:这题跟求最长子序列差不多,dp[i]表示走第i个城市时最多经过的城市的数量,如果第i个城市的花费够用那么 dp[i]=dp[i-1]+1,复杂度是 O(n)         这题主要卡在:1.TLE.原因是输入输出用

2015-06-17 10:54:46 1037

原创 !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 1133

原创 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 695

原创 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 701

原创 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 676

原创 HDU 1081 To The Max--DP--(最大子矩阵)

题意:输入一个二维数组,求和最大的子矩阵分析:一看到和最大的子XX,我就联想到和最大子序列,只不过那是一维这是二维,所以做法都差不多。把二维压缩成一维:你想啊一个矩阵的和不是可以先垂直方向相加把所有行压缩为一行然后这一行相加嘛。压缩过后找最大和的方法跟一维一模一样。但我自己做的时候写了四个循环,唉.....数组可以存放之前求过的和,那么求以下一行为结尾的和的时候只要在原来的数组上加这一行的数就

2015-06-10 20:40:20 860

原创 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 1458

原创 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 805

原创 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 828

原创 !HDU 1158 Employment Planning--DP--(二维)

题意:列出每个月需要的员工数,已知每月工资、以及雇佣和开除员工的额外费用,求最小的预算。(只要员工不被开除就拿工资)分析:开始我想的一维dp,结果在找状态转移方程的时候发现有很多情况要讨论,所以我就认为这题应该是一个贪心题,在准备打代码的时候发现贪心不能得出最优解,所以我就去搜题解了,原来是二维dp。记住一维要分很多情况的要用二维。      dp[i][j]表示第i月用j个员工时前i月的

2015-06-07 13:34:51 775

原创 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 812

原创 !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 816

原创 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 923

原创 !HDU 1025 Constructing Roads In JGShining's Kingdom--DP--(LIS算法)

题意:在马路两边分别有n个城市,给出期望的n条路用于连接两边的城市,但是要求路不能有交叉,求在期望的n条中路实际能保留下来的最大的条数分析:这题很好1.本题抽象出来的模型应该是求最长上升(不下降)子序列2.LIS的 nlog(n)算法:O(n^2) 的算法是dp[i]保留以i结尾的最长上升子序列的长度,令k=dp[i],O(nlog(n))算法是从k的角度出发,设d(k)为在长度为

2015-06-05 20:49:37 548

原创 !HDU 2602 Bone Collector--DP--(裸01背包)

题意:这题就是一个纯粹的裸01背包分析:WA了好几次,01背包实现的一些细节没搞懂1.为什么dp[i][j]赋初值为0而不是value[i],因为第i个石头可能不放!2.在进行状态转移之前要dp[i][j]=dp[i-1][j],不然肯定会WA啊,想想就明白了3.最终结果是dp[n][v],不是每次求mx,因为状态转移就是这么推的啊代码:#include#include

2015-06-03 20:43:40 640

原创 HDU 1723 Distribute Message--DP--(特殊意义)

题意:n个人排成一队,从头开始往后传递消息,第i号人能直接传给第 i+1,i+2.....i+m号,求从头传到尾共有多少种传法分析:可以知道每个人的选择都影响最终的顺序,有一种环环相扣的关联在,所以用dpdp[i]表示从第i号人到尾的传法数,方程:dp[j]=dp[i]+dp[j] 其中 i - j 代码:#include#includeusing namespace std;

2015-06-03 19:47:40 681

原创 !CodeForces 543A Writing Code --DP--(三维dp,滚动数组)

题意:n个程序员一起写m行代码,第i个程序员每写一行有a[i]个bug,求总bug不超过b的分配方案有多少种分析:这题很像完全背包,不过求的不是最大/最小bug数,求的是bug数小于上限的分配方案。所以这题要用三维dpdp[i][j][k]表示前i个个程序员总共写了j行代码产生了k个bug时的plan数,这题有两种转移:1)第i个程序员再写一行;2)换第i+1号程序员写所以方程:dp[

2015-06-02 16:35:42 1146

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除