动态规划
team79
我在努力。
展开
-
hdu 1176 动态规划
很水的动态规划题,但一开始一直想从t推到t+1,一直觉得有问题,然后网上搜了下,看到t+1到t立马通了,让后关了网页自己A状态转移方程是:dp[t][i] = max{ dp[t+1][i-1], dp[t+1][i], dp[t+1][i+1] } + m[]原创 2013-07-07 15:48:19 · 743 阅读 · 0 评论 -
hdu 1203 背包
01背包 坑爹的是 判断结束的条件写错了。。。。AC代码如下:#include #include #include using namespace std;inline double max( double a, double b ){ return ( a > b ? a : b );}inline double p( double a, double b ){ d原创 2013-07-07 17:25:46 · 683 阅读 · 0 评论 -
hdu 1224
DP 状态转移方程很简单。。。。但是输出坑了我无数次。。。太坑了。。。我开始还以为状态转移方程错了。。。。AC代码如下:#include #include using namespace std;int index[1100];struct straight{ int x, y;};void out (int i) { if (i==1) {原创 2013-07-08 08:25:08 · 681 阅读 · 0 评论 -
hdu 1227 DP
经典的DP,用dp[i][j] 表示前j个餐馆建i个仓库 dp[i][j] = min (dp[i-1][k] , cost[k+1][j])(i – 1 AC代码如下:#include #include #include #include #include using namespace std;int main(){ int n, k, dp[35][205], T原创 2013-07-08 11:24:29 · 621 阅读 · 0 评论 -
hdu 1231 DP
超级简单的DP 不过那个判断要注意下。。。我开始用sum = -sum(abs(a[i]))来判断一直错。。。。。。ac代码如下:#include #include #include using namespace std;int main(){ int K, a[10010], first, pos, end, startfrom, dp[10010], flog; w原创 2013-07-08 14:09:46 · 762 阅读 · 0 评论 -
hdu 1244 DP
状态转移方程: dp[i][j] = max( dp[i][j-1], dp[i-1][j-num[i]] + suma[j] - suma[j-num[i]] ); dp[i][j] 表示前 i 个段在前 j 个数中取时的最大和;suma[ j ] 表示第一个数到第 j 个数的和ac代码如下:#include #include using namespace std;inline原创 2013-07-08 15:37:42 · 702 阅读 · 0 评论 -
hdu 1501 DP
思路来自: http://blog.csdn.net/vsooda/article/details/7936229DP解法:最优子结构分析:如上例,如果A、B可以组成C,那么,C最后一个字母e,必定是 A 或 C 的最后一个字母组成。C去除除最后一位,就变成是否可以求出 A-1和B 或者 A与B-1 与 是否可以构成 C-1。。。状态转移方程: 用f[i][j] 表示 表示原创 2013-07-09 18:30:38 · 785 阅读 · 0 评论 -
hdu 1500 DP
这题排序一定要从大到小排序,因为新增的筷子因为目前最长,可以不取,而从大到小,新增的筷子一定要取。dp[i][j] 表示从前i个中去j对ac代码如下:#include #include using namespace std;int dp[5500][1100];inline int min( int a, int b ){ return ( a < b ? a : b原创 2013-07-09 17:53:09 · 855 阅读 · 0 评论 -
HDU 动态规划(46道题目)
转自:http://www.cppblog.com/doer-xee/archive/2009/12/05/102629.htmlRobberies http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱 最脑残的是把总的概率以为是抢N家银行的概率之和转载 2013-07-09 20:36:18 · 705 阅读 · 0 评论 -
hdu 1503 DP
/*分析: 主要注意下是怎么递归输出的。 求最长子串,然后碰到公共字母就输出公共字母, 没碰到的话,先输a还是先输b都行。 */#include #include #include #include using namespace std;char a[110], b[110];int dp[110][110], p[110][110];void f( in原创 2013-07-09 21:21:18 · 642 阅读 · 0 评论 -
hdu 1080 DP
#include #include using namespace std;inline int max( int a, int b, int c ){ int maxi = a; maxi = ( maxi > b ? maxi : b ); maxi = ( maxi > c ? maxi : c ); return maxi;}int main(){ int scor原创 2013-07-15 12:13:57 · 621 阅读 · 0 评论 -
状态压缩动态规划
引入 首先来说说“状态压缩动态规划”这个名称,顾名思义,状态压缩动态规划这个算法包括两个特点,第一是“状态压缩”,第二是“动态规划”。 状态压缩: 从状态压缩的特点来看,这个算法适用的题目符合以下的条件: 1.解法需要保存一定的状态数据(表示一种状态的一个数据值),每个状态数据通常情况下是可以通过2进制来表示的。这就要求状态数据的每个单元只有两种状态,比如说棋盘上的格子转载 2013-07-16 09:43:45 · 699 阅读 · 0 评论 -
hdu 1024 DP
/*问题: 给定由n个整数(可能为负整数)组成的序列e1,e2,…,en,以及一个正整数m,要求确定序列的m个不相交子段,使这m个子段的总和达到最大。 分析: *****************设b(i,j)表示数组e的前j项中i个子段和的最大值,且第i个子段含e[j](1£ i £m,i£ j £n)。以下称b(i, j)为“最后一个元素属于第i子段的j元素i子段原创 2013-07-16 15:42:55 · 583 阅读 · 0 评论 -
最长递增子序列问题的求解(LIS)
转自:http://blog.pfan.cn/rickone/13086.html写的真好。最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想,能够锻炼设计较复杂算法的思维,我对这个问题进行了较深入的分析思考,得出了几种复杂度不同算法,并给出了分转载 2013-07-05 09:25:31 · 772 阅读 · 0 评论 -
hdu1003.....暑期集训第一天动态规划WA了4次......
#include using namespace std;int main(){ int T, a[100000], maxsum, first, end, pos, number, n, startfrom; cin >> T; n = 1; while( T-- ){ cin >> number; for( int i = 0; i < number; i++ )原创 2013-07-04 15:06:41 · 788 阅读 · 0 评论 -
hdu 2602 dp
呵呵 超级水题AC代码如下:#include #include using namespace std;inline int max( int a, int b ){ return ( a > b ? a : b );}int main(){ int T, N, V; int dp[1001]; int v[1001], w[1001]; cin >> T; wh原创 2013-07-23 11:31:43 · 946 阅读 · 0 评论 -
hdu 3466 DP
/* 开始的时候以为Q只是在状态转移的时候的一个限制,然后直接连给的测试都过不了, 然后我就想是不是要排序下。。。然后按Q排序。。然后过了测试,提交。。。。毫无疑问的WA了。。。。。 然后就蛋疼了想不出来了。。。然后看了别人的解题报告发现是要按Q-P来从从小到大排序。 原因如下: 在状态转移方程中 for( int i = 0; i < N; i++ ){ for( i原创 2013-07-23 19:08:29 · 646 阅读 · 0 评论 -
hdu 2126 DP
/* dp[i][j][k] 表示从前i个物品中选j种所花费的金钱数小于等于k的购买方案. 状态转移方程为: if( k >= p[i] ){ dp[i][j][k] = dp[i][j][k] + dp[i-1][j-1][k-p[i]]; } dp[i][j][k] = dp[i][j][k] + dp[i-1][j][k]; 还有一点要注意的是初始化; mems原创 2013-07-23 20:26:10 · 597 阅读 · 0 评论 -
hdu 2955 dp
/* 这题开始的时候以为小数不会超过两位小数,所以就乘了一百来做,最后一直错。后来看了别人的解题报告才恍然大悟。 这题的状态转移方程是 dp[j] = max{ dp[j], dp[j-v[i]] * p[i]}; 我们不从概率推上去,而是从价值推上去,这样就避免了从概率推上时候的小数的问题。 做这题的时候还遇到了一些细节问题,写在了代码之中,以后要注意。。。。。 还是要多练啊。原创 2013-07-23 16:08:44 · 650 阅读 · 0 评论 -
poj 2923 DP
很好的一道题目。思路:先求出哪些货物的组合能一次用两辆车运走,然后再对这些组合DP。dp[j]代表能运走(j)中组合的的货物的最少次数。。。状态转移方程:dp[j|onestep[i]] = min( dp[j|onestep[i]], dp[j] + 1 );(注意。。。代码中已经保证 一次运走(j)组合、(onestep[i])组合是可行的。。。所以这个方程才成立。。。)#原创 2013-07-25 14:51:44 · 723 阅读 · 0 评论 -
poj 3624 DP
背包。。。不多说。。。上代码。。。。#include #include using namespace std;inline int max( int a, int b ){ return ( a > b ? a : b );}int main(){ int N, M; int w[3402], v[3402]; int dp[12881]; while( scanf(原创 2013-07-25 10:58:12 · 696 阅读 · 0 评论 -
poj 2184 DP
这一题可将s作为w,f作为v来用背包,最后求满足情况的最大的i+dp[i],但是要注意先循环w[i]大于零的,再循环小于零的,因为在循环小于零的时候要用大大于零的。。。。然后就没有然后了。。。。AC代码如下:#include #include using namespace std;#define MAXN 100010;inline int max( int a, int b原创 2013-07-25 12:53:41 · 747 阅读 · 0 评论 -
背包问题中求次优解,第K优解的方法
对于求次优解、第K优解类的问题,如果相应的最优解问题能写出状态转移方程、用动态规划解决,那么求次优解往往可以相同的复杂度解决,第K优解则比求最优解的复杂度上多一个系数K。其基本思想是将每个状态都表示成有序队列,将状态转移方程中的max/min转化成有序队列的合并。这里仍然以01背包为例讲解一下。首先看01背包求最优解的状态转移方程:f[i][v]=max{f[i-1][v],f[i-1][原创 2013-07-25 10:47:41 · 1428 阅读 · 1 评论 -
poj 3181 DP
dp[i][j]表示前i种价值的物品构成总价值为j的种类数......完全背包.........不过有一点要注意的是这题是大数!!!!大数!!!!!我开始WA了好多次....还以为是方程错了....最后才发现特么的时大数....然后看了别人的...用两个数拼一下就行.......但是我感觉这样的话要是dp1[N]没有那么多位的话,应该用0补齐啊...但是不补齐也行了....是数据水还是怎么原创 2013-07-25 15:50:19 · 1271 阅读 · 0 评论 -
poj 1787 DP
dp[j] 表示 j 块钱最多由多少块硬币组成, prev[j] 表示 上一次最多有多少块构成的 j 块钱, used[j] 表示 j 块钱时,已经放了多少同种类的硬币。AC代码如下:#include #include using namespace std;int main(){ int P, dp[10001]; int prev[10001], used[10001];原创 2013-07-25 16:58:04 · 685 阅读 · 0 评论 -
poj 3260 DP
这题一开始是在不知道怎么做....最后才发现要分开做啊.....dp1[j]表示买j块钱的东西用的最少的硬币数量,dp2[j]表示找j快钱用的最少的硬币数量。一个是多重背包,一个是完全背包.....注意:多重背包要优化,不然会超时......AC代码如下:#include #include using namespace std;const int MAX = 0x3f3f原创 2013-07-26 16:49:10 · 689 阅读 · 0 评论 -
hdu 2063 DP
注意除个1000就不会超时了.....好吧.....不A了....去见女神了!哈哈哈哈哈哈哈哈哈哈哈哈哈!!!!原创 2013-07-27 13:51:58 · 661 阅读 · 0 评论 -
hdu 1712 DP
分组背包.....第一道分组背包....而且是在快半夜两点的时候.....AC代码如下:#include #include #include using namespace std;inline int max( int a, int b ){ return ( a > b ? a : b );}int main(){ int N, M; int v[101][101原创 2013-07-27 01:28:12 · 662 阅读 · 0 评论 -
poj 2392 DP
首先按a从小到大排序,然后就是多重背包....注意优化.....这一题要注意的是最大值不一定在 dp[n[i].a]初取到,因为有可能n[i].h和n[i].a很接近,导致只有一个从上一状态继承而来,而且还没有上一状态的最大值大....所以......要求最大值....AC代码如下:#include #include #include using namespace std;原创 2013-07-28 09:15:20 · 609 阅读 · 0 评论 -
hdu 3033 DP
题意:一个人买商品,必须每个种类的商品至少买一件,同时保证买到的价值尽可能大,如果不能满意,输出Impossible。分组背包的变种,普通分组背包是一个组里面最大取一件,这题是至少取一件。 设计状态dp[i][j]代表前i组容量为j的最大价值。由于一组里面有多个物品,所以状态转移可以是前一组少取一个,即dp[i-1][p-g[i][j].v]+g[i][j].w,也可以是当前组之前去过原创 2013-07-28 01:22:25 · 614 阅读 · 0 评论 -
poj 3211 DP
这题对每一种颜色的衣服进行01背包,求出每一种最接近该颜色总时间一半的时间,然后总时间减去求出的时间再求和就是所求的时间....其他的就不多说了....AC代码如下:#include #include #include #include #include using namespace std;int dp[100001];inline int max( int a, i原创 2013-07-28 10:58:38 · 617 阅读 · 0 评论 -
poj 1276 DP
没优化果然华丽丽的超时了.....其他就不说了,基本的多重背包.....AC代码如下:#include #include using namespace std;inline int max( int a, int b ){ return ( a > b ? a : b );}int main(){ int Cash, N; int value[10], number[原创 2013-07-27 20:20:36 · 689 阅读 · 0 评论 -
poj 1837 DP
转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1299341345提示:动态规划,01背包初看此题第一个冲动就是穷举。。。。不过再细想肯定行不通= =O(20^20)等着超时吧。。。我也是看了前辈的意见才联想到01背包,用动态规划来解 题目大意:有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个原创 2013-07-28 09:47:15 · 674 阅读 · 0 评论 -
hdu 3810 DP
原文转自:http://blog.csdn.net/woshi250hua/article/details/7609293题目大意:题目源自Dota,前面一堆介绍敌法师,最后一段才开始说有n堆野兽,每堆野兽屠杀完完需要花费ti时间,可以增加金钱gi,敌法师有瞬移技能,可以从某堆野兽移到另一堆野兽,题目有给定从哪堆可以移到哪堆。最后问在满足打的金钱多余m的情况下的最少时间。解题思路:原创 2013-07-28 15:40:18 · 921 阅读 · 0 评论 -
POJ 动态规划题目列表
转自:http://www.cnblogs.com/qijinbiao/archive/2011/09/02/2163460.html声明:1.这份列表当然不是我原创的,从文库里下载了一份,放到这里便于自己浏览和查找题目。(鄙人的目的也与此基本相同,感谢前辈的无私的奉献,小弟在此感激别尽!)※最近更新:Poj斜率优化题目1180,2018,3709 列表一:经典题目题号:转载 2013-08-05 19:41:32 · 748 阅读 · 0 评论 -
hdu 3535 DP
#include #include #include using namespace std;typedef struct{ int number; int type; int w[100]; int v[100];}Set;inline int max( int a, int b ){ return ( a > b ? a : b );}int main(){原创 2013-08-05 18:11:27 · 587 阅读 · 0 评论 -
hdu 4003 树形DP
转自:http://blog.csdn.net/woshi250hua/article/details/7648099 不是很懂啊 以后再来看看题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003题目大意:给定一棵n个节点的树,遍历每条数边都需要费用cost,现在给定k个机器人,要求用这个k个机器人遍历整棵树,使得经过的费用和最小,n原创 2013-08-06 15:18:23 · 642 阅读 · 0 评论 -
poj 2486 树形DP
见注释。AC代码如下:#include #include #include #include using namespace std;int N, K;int dp[2][101][201];vector edge[200];bool visit[101];int apple[101];inline int max( int a, int b ){ return原创 2013-08-06 16:51:54 · 580 阅读 · 0 评论 -
hdu 1520 树形DP
dp[i][0] 表示不选第i个节点的最大价值,dp[i][1]表示选第i个节点获得的最大价值。状态转移方程:dp[i][1] = val[i] + E dp[j][0] ( j是i的子节点 E表示求和 );dp[i][0] = E max(dp[j][0], dp[j][1] )(j是i的子节点);对于叶子节点有:dp[i][0] = 0;dp[i][1] = val[原创 2013-08-07 10:11:02 · 586 阅读 · 0 评论 -
hdu 2196 树形DP
选取任意一节点作为根节点,我选的是1,然后先用一次DFS求出每个节点向下的最大权值和,然后第二次DFS的时候先更新向上的最大权值和,然后求出向上向下中最大的权值和即为该点的所求值。 其中的更新的正确性可以用数学归纳法证明。(初始正确, 每步之后正确)其实自己画图就能明白,可能说的不清楚,最好自己画图看看。AC代码如下:#include #include #include usin原创 2013-08-07 14:00:19 · 576 阅读 · 0 评论