就是DP
ITCharge
高效率编程,慢节奏生活。
展开
-
HDU1224_Free DIY Tour【DP】【回溯】
题目大意:进行一场DIY的旅行,总共有N座城市,每座城市有一个有趣值,但是城市之间不一定有直接通往的航班。 给你城市间航班情况。每次从第一个城市出发,最后回到第一个城市,形成一个环路。问使得有趣值最大的最佳环路和其有趣值是什么。思路:设dp[i]为从城市1到第i个城市获得的最大有趣值和,更新dp[i]的时候,用pre[i]记录当前节点的前驱,最后向前回溯并记录路径。然后输出路径。原创 2014-12-01 12:45:47 · 1312 阅读 · 0 评论 -
HDU1003 Max Sum【DP】
题目大意:求使连续子序列的和最大的第一元素,最后一个元素位置,和子序列的和思路:动态规划的方法,主要是找到状态转移方程。将之前累加和加上当前值与当前值做比较, 如果将之前累加和加上当前值>当前值,那么加上当前值,最后一个元素位置变为i,如果将之前累加和加上当前值<当前值,那么sum[i] = a[i],并且改变第一元素位置为i,最后元素位置为i。具体看代码。状态转移方程:sum[i]=max(sum[i-1]+a[i],a[i]);原创 2014-10-17 21:33:07 · 1293 阅读 · 0 评论 -
HDU1231_最大连续子序列
题目大意:求使连续子序列的和最大的第一元素,最后一个元素和子序列的和思路:动态规划的方法,主要是找到状态转移方程。将之前累加和加上当前值与当前值做比较, 如果将之前累加和加上当前值>当前值,那么加上当前值,最后一个元素变为i,如果将之前累加和加上当前值<当前值,那么sum[i] = a[i],并且改变第一元素为i,最后元素为i。具体看代码。状态转移方程:sum[i]=max(sum[i-1]+a[i],a[i]);原创 2014-10-17 21:23:37 · 1226 阅读 · 0 评论 -
Ural1114 Boxes【DP】
题目大意:有N个盒子,有红色和蓝色两种颜色的球。红球有A个,篮球有B个。现在随意的向盒子里放球,每个盒子可以放一种颜色的球,也可以放两种颜色的球,也可以不放球。问:总共有多少种方法。解题思路:用DP来做。设dp[i][j][k]表示到第i个盒子为止,用了j个红球和k个篮球。则dp[i][j][k] = Σ(dp[i-1][jj][kk])(j <= jj <= A,k <= kk <= B)。则最终结果为Σdp[N][j][k](0 <= j <= A,0 <= k <= B)。注意:这题l原创 2015-08-14 21:13:07 · 778 阅读 · 0 评论 -
HDU1024_Max Sum Plus Plus【滚动数组】
题目大意:给你两个数M和N,之后是N个数,从这N个数找到M个子段,求M个子段的最大和思路:一开始不懂怎么找状态转移方程。参考别人博客才明白。.设dp[i][j] 为将前 j 个数字分成 i 段的最大和。num[j]为当前数字那么转移方程为 dp[i][j] = max(dp[i][j-1]+num[j],dp[i-1][k]+num[j]) (i-1<=k<=j-1)也可以视为 dp[i][j] = max(dp[i][j-1]+num[j],max(dp[i-1][i-1],dp[i-1][i]原创 2014-11-18 13:06:53 · 1064 阅读 · 0 评论 -
HDU2391 Filthy Rich【数塔DP】
题目大意:在一个N*M的矩阵中,不同的位置上有不同重量的黄金,从矩阵的左上角开始,只能向右或是向下走,问:从左上角走到右下角最多能获得多少黄金。思路:简单的数塔DP,状态转移方程:dp[j] = max(dp[j-1],dp[j])+ Map[i][j]。原创 2015-03-30 11:49:03 · 1241 阅读 · 0 评论 -
HDU1158_Employment Planning【DP】
题目大意:老板想要决定M个月每个月需要的工人数,已知雇佣一个工人的价格,工人的月薪,解雇一个工人的价格,又知道M个月每个月至少需要多少个工人。问:怎样雇佣工人,才能使得满足M个月工人需求的同时,付出最少的钱。思路:在M个月中求出最大的需求人数Max,那么无论下个月需要多少个工人,最多雇佣Max个工人也就够了。状态转移方程:dp[i][j] = min(dp[i-1][k] + cost)(num[i-1] <=k <= Max)意思是:第i个月雇佣j个人 = 当上个月雇佣k个人时的最小花费 +原创 2014-11-27 10:59:04 · 1569 阅读 · 0 评论 -
HDU2084_数塔【简单题】【数塔】
题目大意:比较好理解思路:若从上往下考虑的话,每次有两个选择,N层数塔就有2^(N-1)种方案,遍历一边不科学。换种方式,从下往上考虑,每次比较临近两个数的大小,让较大的数往上加,这样每次选择得到的都是最优的情况,逐层上移累加,最终加到顶部的时候,得到的结果就是最优的,即最大的。原创 2014-10-20 09:25:14 · 1457 阅读 · 0 评论 -
HDU1506_Largest Rectangle in a Histogram
题目大意:给你一个直方图,告诉你各个条形矩形的高度,求基线对齐构成的矩形中面积最大的矩形的面积对于每一个矩形。面积 = h[i]*(j-k+1),其中j,k是左右边界,h[i]是矩形的高。并且对于j <= x <= k,h[i] <= h[x]。本题中,找到左右边界j,k是关键。利用动态规划的方法,对于位置i,如果左边条形矩形的高度大于它本身,那么左边的左边界一定也满足位置i的左边界。同理如果右边条形矩形的高度大于它本身,那么右边的右边界也一定满足位置i的右边界。迭代循环下去。直到找到i的左右边原创 2014-10-18 09:57:36 · 3000 阅读 · 1 评论 -
切割钢条【动态规划】
切割钢条【动态规划】首先将钢条切割为长度为i和n - i两段,接着求解这两段的最优切割收益Ri和Rn - i(每种方案的最优收益为两段的最优收益之和),由于无法预知哪种方案会获得最优收益,我们必须考察所有可能的i,选取其中收益最大者。如果直接出售原钢条会获得最大收益,我们当然可以选择不做任何切割。钢条切割问题还存在一种相似的但更为简单的地柜求解方法:我们将钢条从左边切割下长度为i的一段,只对右边剩下长度为n-i的一段惊醒切割。(递归求解),对左边的一段则不再切割。即问题的分解方式为:将长度为n原创 2014-10-16 20:54:54 · 1289 阅读 · 0 评论 -
HDU2571_命运
命运题目大意:给你一个M*N的区域,只能向右走或是向下走。向下只能走一步,向右能够走一步或者走当前列数的倍数次(最小为2倍),问走到右下角,总和最大是多少思路:动态规划思想。每一点dp[i][j]的值都为向上一步dp[i-1][j]或是向左一步dp[i][j-1]得到最大和中的较大值,再比较它本身与它的1/2、1/3…倍(前提是1/2、1/3…倍为整数)比较,取较大值,最后加上本身就是当前最优的情况。递推到dp[N][M],得到结果。原创 2014-10-20 21:04:32 · 921 阅读 · 0 评论 -
HDU2577 How to Type【DP】
题目大意:给你一个只包含大小写字母的字符串,现在Pirates要从键盘上输出它,按CapsLk可开启关闭大小写指示灯。按Shift可转换将输入字母的大小写而不改变CapsLk的开关状态。Pirates有一个坏习惯,如果输入的时候CapsLk是开着的,那么输入结束后必须把它关闭。问,输入一个字符串,最小的按键数目是多少思路:用两个数组dpa和dpb分别来表示CapsLk关闭状态和开启状态的最小操作数。如果将要输入的字母是小写字母:dpa[i+1] = min(dpa[i]+1,dpb[i]+2);原创 2014-10-29 14:44:09 · 1041 阅读 · 2 评论 -
HDU1176_免费馅饼【数塔】
题目大意:总共有0~10个位置,gameboy站在5的位置上。给你馅饼掉落的时间的位置。gameboy每秒只能到自己位置临近的位置接馅饼。比如在5的位置上只能接到4 5 6的馅饼。在7的位置上只能接到 6 7 8的馅饼。问gameboy最后最多能接到多少馅饼。思路:动态规划的思想。将位置整体右移一个单位。位置为1~11。这样方便计算。建立二维数组。一维代表时间,二维代表位置。点上的值代表馅饼的个数。按时间顺序存储馅饼个数。最后从底往上递推。每次比较馅饼位置i和馅饼位置i-1和馅饼位置i+1的原创 2014-10-22 09:34:41 · 955 阅读 · 0 评论 -
HDU1422 重温世界杯【DP】
题目大意:给你N个城市,参观路线为1~2~3~4~5~…~N~1。可以从任何一座城市开始参观。每座城市提供的生活费和需要的花费都不同,问:最多能参观多少个城市。思路:因为能形成循环,所以在原有数据的后边再接上1~N的数据。然后用动态规划来做。状态为:当上一个城市剩下的钱不为负(即还未结束旅游),如果上一个城市剩下的钱加上当前城市的钱大于当前的生活费,那么dp[i] = dp[i-1] + 1,更新剩下的钱,如果不够旅游了,就将剩下的钱归为0,从当前点开始旅游,计算最大的dp[i],得到的就是原创 2015-04-25 21:53:36 · 1470 阅读 · 0 评论 -
HDU2870_Largest Submatrix【最大完全子矩阵】
题目大意:有个字母矩阵,包含字母"a、b、c、w、x、y、z",其中,w能变为"a、b",x能变为"b、c",y能变为"a、c",z能变为"a、b、c"。问能构成的最大字母完全一样的子矩阵面积为多大?思路:和HDU1505、HDU1506一样的思路,其中a[i][j]表示转换为字母a后以第i行为底,第j列上方连续空闲位置的高度。b[i][j]表示字母b……,c[i][j]表示字母c……遍历计算出该点向左右两边延伸的左右边界,从而计算出面积,最终比较计算出最大面积。原创 2014-11-04 17:13:15 · 1967 阅读 · 1 评论 -
HDU1505_City Game【最大完全子矩阵】
City Game题目大意:给你一个M*N的区域。R代表被占用,F代表空闲。每块空闲的区域价值3美金,求全部由空闲区域围成的矩形的价值思路:1506的升级版。不同的是,1505是二维的。把2维转换为以每一行为底,组成的最大面积就转换成了1506题。参考1506题解题报告:http://blog.csdn.net/lianai911/article/details/40208265其中h[i][j]表示第i行为底,第j列上方连续空闲位置的高度。遍历计算出该点向左右两边延伸的左右边界,从而计算出原创 2014-10-20 16:38:45 · 2859 阅读 · 0 评论 -
HDU-1494-跑跑卡丁车
跑跑卡丁车Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2232 Accepted Submission(s): 749Problem Description跑跑卡丁车是时下一款流行的网络休闲游戏,你原创 2014-05-17 23:33:34 · 1074 阅读 · 0 评论 -
HDU1421_搬寝室【最优决策】
题目大意:有N件物品,给你每件物品的重量,现在要搬2*k件物品到另一栋楼上,每次搬两件物品,每次耗费的疲劳度为两件物品重量差的平方。问:搬完2*k件物品,耗费的疲劳度最少为多少?思路:重量相差越小,则重量差的平方越小。所以先对重量进行排序,所选的一对物品,肯定是相邻的两件物品。设d[i][j]为前第i件物品选择第j对物品的时候,所消耗的最小疲劳度。前i件物品,若选择第i件物品,肯定是和第i-1件物品配对。这时候dp[i][j] = dp[i-2][j-1] + (w[i]-w[i-1])*(w原创 2014-11-06 21:09:56 · 963 阅读 · 0 评论 -
POJ3176_Cow Bowling【数塔DP】
题目大意:给你一个三角形的数塔,问从上走到最下边,得到最大的和是多少思路:从下往上推,当前值大的和上边的值相加原创 2014-11-24 15:38:30 · 937 阅读 · 0 评论 -
HDU1331 HDU1579 Function Run Fun【记忆化搜索】
题目大意:给一些递归条件,给你三个数a、b、c,求出w(a,b,c)是多少。思路:按题目要求递归的话会超时,所以用dp[a][b][c]来保存下递归函数的值,自底向上得出结果。原创 2015-04-08 11:03:55 · 1250 阅读 · 0 评论 -
HDU5492 Find a path【DP】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5492参考博文:http://blog.csdn.net/Baileys0530/article/details/48768123AC代码:#include#include#include#include#define LL __int64using nam原创 2015-10-03 17:32:05 · 749 阅读 · 0 评论