动态规划
小盼你最萌哒
这个作者很懒,什么都没留下…
展开
-
背包问题 递归思路
对于刚了解背包问题的时候,直接看递推代码太麻烦了,理解背包问题解法的原理最好先看没有优化的递归过程。/* 朴素的递归实现 0-1 背包 */#include<stdio.h>int val[] = {60, 120,100};int wt[] = {10, 30,20};int W = 50;int max(int a, int b) { return (a > b)? a :原创 2015-08-30 20:10:32 · 861 阅读 · 0 评论 -
HDU 1160 FatMouse's Speed 最优方案
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1160题目大意: 把老鼠按肥胖值的严格升序排列,求速度的最大下降子序列。并输出这组最优方案。需要把体重、速度、序号绑定在一起,所以我们用结构体。 求最大下降子序列从后往前就是求的最大上升子序列。而求解的方法有很多种,其中的dp值有很多种意思,虽然都能输出最长的值,但是这里还要求输出最优解的组成,所以有原创 2015-07-28 21:18:01 · 423 阅读 · 0 评论 -
HDU 1231 最大连续子序列
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1231dp代表的是到当前位置的最大连续子序列的和。原创 2015-07-29 09:02:05 · 364 阅读 · 0 评论 -
HDU 1950 Bridging signals 桥接信号
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1950题目大意: 要求连线不能交叉,换个思路理解,其实就是要求下一个点连接的序号要比上一个点的序号至少大1,(比上个序号小就会交叉,等于的话就连到一起了。。。),要求连接的数目最多,所以这就是求一个最大上升子序列。相信大家对于O(n^2)的算法都会了。这里介绍下O(nlogn)的算法。 O(n^2)的原创 2015-07-29 09:30:18 · 450 阅读 · 0 评论 -
HDU 2571 命运
原题: http://acm.hdu.edu.cn/showproblem.php?pid=2571题目:命运Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13019 Accepted Submission(s): 4535Pr原创 2015-07-29 09:46:37 · 349 阅读 · 0 评论 -
HDU 1284 钱币兑换问题
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1284这题一看就是学c语言百钱买百鸡的问题,所以我的代码是这样的。#include <iostream>#include"string.h"#include"cstdio"#include"stdlib.h"#include"algorithm"using namespace std;int m原创 2015-07-29 10:03:22 · 394 阅读 · 0 评论 -
HDU 1963 Investment 最大利息
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1963题目大意: 有一笔钱,可以按不同的金额存到银行,每年都有相应的利息。一定年限后要求有最多钱。注意存入的钱只会以1000的倍数。比如样例: 10000本金第一年买两次3000的,买一次4000的,就一共有10900元。 第二年因为900块用不出去,所以能用的钱和第一年一样,最后剩11800元。原创 2015-07-29 10:13:19 · 446 阅读 · 0 评论 -
HDU 1864 最大报销额
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1864简单的01背包问题,就是在数据的读入和判断麻烦了点,还有价值是两位数的小数,必须要乘以100才能处理成整数进行状态转移。原创 2015-07-29 10:22:51 · 398 阅读 · 0 评论 -
POJ 1276 Cash Machine 最多机器
原题: http://poj.org/problem?id=1276题目大意: 输入最大背包容量,物品种类数,再依次输入物品数目和重量,求出最多能装多少容量的物品。 显然是一个需要用二进制优化的多重背包问题。原创 2015-07-29 10:41:46 · 354 阅读 · 0 评论 -
POJ 3264 Balanced Lineup RMQ问题 ST算法 O(1)查找区间最值
原题: http://poj.org/problem?id=3264题目大意: 给定n个数的值,求区间最大值和最小值的差。线段树可以以nlogn的效率完成预处理,以logn的效率完成查找区间最值,这里介绍一种nlogn处理,O(1)查询的方法。就是st算法。这里我们来看一个表。 第一排表示的是以该点为起点,连续的2^0个数的最大值。 第二排表示的是以该点为起点,连续的2^1个数的最大值。原创 2015-08-04 16:11:43 · 533 阅读 · 0 评论 -
HDU 1159 Common Subsequence 公共子序列
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1159题目大意: 求两个字符串的最长公共子序列。 以例题第一个例子为例: dp[i][j]横向表示第一个字符串,纵向表示第二个字符串,dp[i][j]表示从第一个字符串从一个到第i个与第二个字符串的第一个到第j个的公共子序列的长度。 第一步:拿第二个字符串的第一个字符去和第一个字符串比较。原创 2015-07-28 20:40:51 · 356 阅读 · 0 评论 -
HDU 1087 Super Jumping! Jumping! Jumping! 最大连续子序列和
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1087原题大意: 从起点开始跳,第一次可以调到任意位置,后面就只能调到比它大的位置或者终点。 求跳过的点的和的最大值,其实就是求最大和的上升子序列。 状态转移方程:if(weight[i]>weight[j]) dp[i]=max(dp[i],dp[j]+weight[i]);当序列上升的时原创 2015-07-28 20:21:05 · 327 阅读 · 0 评论 -
HDU 5234 Happy birthday 最多蛋糕
原题: http://acm.hdu.edu.cn/showproblem.php?pid=5234题目大意: 从左上角出发,走到右下角,每次可以向右或者向下走,走过的地方有蛋糕数量,求不超过指定数量的最大值。如果只能向右走或者向下走,那么这是个01背包。 现在可以向右和向下,其实也是个01背包。三维数组dp[i][j][k],其中ij分别表示坐标,k表示当前当前背包容量,dp值为真表示满足从原创 2015-07-26 22:06:30 · 458 阅读 · 0 评论 -
POJ 1787 Charlie's Change 最多金币
原题: http://poj.org/problem?id=1787题意:输入需要凑齐的面值P,输入四种货币的数目,面值分别为1,5,10,25,求出一种可以凑齐P的方案,要求使用的金币数最多。显然,这种有数量限制的货币我们可以看作是多重背包,就按多重背包的处理方式求最大货币数。至于难点如何求出最大具体的方案,我们只需要用一个path[]数组保存过程就可以了。 path[j]=j-value[i]原创 2015-07-28 16:41:19 · 469 阅读 · 0 评论 -
HDU 1176 免费馅饼
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1176题目大意: 每秒可以选择左右移动一格,要求接到最多馅饼。只需要一个滚动数组就可以完成,这里用dp和dptemp来表示。 因为每次的下一秒可以左移一格右移一格或者原地不动,反过来看,所以每次的状态又可以由上一次状态的左移一格右移一格或者不动来决定。 dptemp[j]=max(dp[j-1],dp原创 2015-07-28 18:14:02 · 373 阅读 · 0 评论 -
HDU 1114 Piggy-Bank 存钱罐
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1114原题大意: 给定已知背包容量,给定已知货物价格和重量,求出装满背包容量的时候价值最少的情况。常见的背包问题的状态转移方程都是用max函数得到最优解,而本例其实只需要把max改成min就行了,但是前提条件是要将dp数组初始化为无穷大,这样min才不会每次都得到0。不习惯用min的也可以用max,只需要原创 2015-07-28 18:57:45 · 693 阅读 · 0 评论 -
HDU 1203 I NEED A OFFER! 最大概率
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1203题目大意: 已知每个学校的花费和通过率,选择适当的学校以求最大的通过率。 如果我们要算通过的概率,情况就有很多种,但是不通过的概率只有一种,就是所有学校都不成功。 求最大通过率的问题就被转化成了最小失败的概率。 简单的01背包问题,只需要把dp的含义从最大利润变成最小概率。可用min函数进行状原创 2015-07-28 19:09:13 · 320 阅读 · 0 评论 -
HDU 1171 Big Event in HDU 多重背包01求解
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1171题目大意: 给定物品的价值和数目,尽量平均分给两个人。其实就是让其中一个人挑选物品,让物品的价值尽量接近总价值的一半。其实就是一个多重背包问题,对于这种简单的数据量小的问题,如果我们把相同的物品看作不同物品,就可以把题目理解成所有物品只能选一次,我们可以用01背包的方式求解。 代码如下:#incl原创 2015-07-28 19:22:37 · 381 阅读 · 0 评论 -
HDU 1059 Dividing 多重背包二进制优化
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1059题目大意: 有面值分别为1,2,3,4,5,6的6种货币,输入相应的数据,输出能否均分两份。 其实是一个多重背包问题,背包容量为货币总价值的一半。 难点在于当数据太大的时候,循环次数太多会超时,这里我们使用二进制优化的思想,可以大大的缩小时间复杂度,从O(n)下降到O(logn)。这里解释下二进原创 2015-07-28 19:48:27 · 397 阅读 · 0 评论 -
HDU 2844 Coins 方案总数
原题: http://acm.hdu.edu.cn/showproblem.php?pid=2844题目大意: 给定n种货币的价值和数目和总价上限m,求能凑出多少种不同的面值。动态规划求解出的dp数组储存的是当前状态下能凑出的最大金额数。 这里用与dp等长的ans数组存储答案,每次求出一个dp值,对应位置的ans值++,只要ans值不为0,那么该面值就是可取状态。 最后遍历有多少个不为0即可原创 2015-07-28 19:59:44 · 298 阅读 · 0 评论 -
HDU 2546 饭卡
原题: http://acm.hdu.edu.cn/showproblem.php?pid=2546这道题唯一的坑就是低于5元不能买,所以只需要把当前余额减去5再算就可以了。 显然,最后一件物品放价值最大的是最划算的,所以当我们余额减去5之后,就可以肆无忌惮的买买买了,反正最后5元能买最多的,就是赚的最多了。原创 2015-07-28 20:14:56 · 288 阅读 · 0 评论 -
HDU 1081 To The Max 暴力模拟O(n^4) dp优化O(n^3)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1081题目大意: 求给定边长的正方形选一个矩形,使它包含的所有元素的值最大。大家都知道(a+b)^2的展开式,这里的优化就是用了这个原理来做的优化,我们的dp值是我们前i行j列的矩形区域的值。 任意矩形区域的值通过该展开式也能求解,所以我们可以暴力枚举每种以左上角(k,l)到右下角(i,j)的情况。原创 2015-08-12 20:33:37 · 607 阅读 · 0 评论