
DP
zhang360896270
任何语言中的任何语法特性的诞生都不是随意而为的,来源于真实世界的需求驱动。
展开
-
hdu1864 最大报销额
<br />彻头彻尾的0/1背包,存储double类型背包状态有个小技巧就是乘以小数点后相应位数n的10^n,这样可以将其转换为整形作为数组下标进行运算,算法不难,按照题目意思筛选每一张发票,满足条件的才存入背包数组,然后就是0/1背包了,最后输出a[最高报销额]就是结果。。。今天元宵节,各位元宵节快乐!!原创 2011-02-17 22:20:00 · 725 阅读 · 0 评论 -
DP与贪心算法的一点浅见
DP:考虑且仅仅考虑由前一阶段状态转移到当前状态后,递推并选取出当前状态的最优解,具有无后效性和最优子结构的基本特征,其中所谓的无后效性是指:“下一时刻的状态只与当前状态有关,而和当前状态之前的状态无关,当前的状态是对以往决策的总结”。因此DP是由前一阶段的一系列阶段转移并选取最优而来,即抵达当前状态路径不唯一,仅是最终最优结果唯一。DP设计的具体步骤: (1)划分阶段:按照问题的原创 2013-04-26 12:14:38 · 7297 阅读 · 3 评论 -
POJ1949Chores
比较简单的DP,注意这一句话Farmer John's list of chores is nicely ordered, and chore K (K > 1) can have only chores 1,.K-1 as prerequisites意思是在完成第K个任务时原创 2011-09-01 11:25:59 · 743 阅读 · 0 评论 -
poj1661Help Jimmy
从下向上倒推,dp[i][0]表示从第j块板子到第i块板子的左边的最小路程,dp[i][1]表示从第j块板子到第i块板子的右边的最小路程,先从小到大给板子排序,如果当前第i块板子下面有第j块板子的话,则比较从当前 第j块板子的左右分别到第i块板子的左右最小路程有点细节要注意原创 2011-07-14 21:39:32 · 593 阅读 · 0 评论 -
poj1678 I Love this Game!
其他的已经加了注释,现在重点解析一下 dp[i] = num[i] - maxx;这句话的意义,首先dp[i]表示的是当前我取第i个,而下一个人取第j个数(num[j]>num[i])可以达到最优,那么为什么要取最大的dp[j]呢?因为这样可以保证每次取得的策略最优,dp[j]是原创 2011-07-11 16:51:44 · 768 阅读 · 0 评论 -
状态压缩DP入门题
在n*n(n≤20)的方格棋盘上放置n 个车(可以攻击所在行、列),求使它们不能互相攻击的方案总数。仅供和我一样的菜鸟们参考, 以n=4为例子解析源码#include #include using namespace std;__int64 a[110原创 2011-07-11 09:48:02 · 2416 阅读 · 0 评论 -
hdu1025 Constructing Roads In JGShining's Kingdom
最近准备开始重拾DP,此题本质是求最长上升子序列,用a[u]=v表示当前第u个贫穷的城市对应的对面第v个富裕的城市,然后dp[i]表示当前长度为i时的最小a[k]值,为什么是最小呢?因为只有这样才能保证上升序列达到最长长度,只有尽可能的将dp[len]的值变小才能加入更多的a[i原创 2011-07-10 21:03:42 · 760 阅读 · 0 评论 -
hdu1078 FatMouse and Cheese
<br />简单的DP,DFS找到当前点能够获得的最大奶酪数。。。。要用备忘录<br /><br />#include <iostream><br />#include <queue><br />using namespace std;<br />const int size = 110;<br />const int Go[4][2] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};<br />int n, k;<br />int map[size][size];<br />in原创 2011-06-01 19:53:00 · 459 阅读 · 0 评论 -
hdu2571 命运
<br />悲剧,被这个名为命运的题目玩了几个小时,过掉正数数据但是过不掉负数数据,ORZ。。改了好久。。。其实就是DP,ans[i][j]表示到第(i, j)点的最大幸运点,然后就可以依照题目列出转移方程<br />ans[i][k*j] = max( ans[i][k*j],ans[i][j]+maze[i][k*j]);(向右走k*j步)、ans[i][j+1] = max(ans[i][j+1], ans[i][j]+maze[i][j+1]);(向右走一步)和ans[i+1][j] = an原创 2011-05-19 17:21:00 · 1093 阅读 · 0 评论 -
POJ1952 BUY LOW, BUY LOWER
这题要求最长下降子序列的长度和个数,我们可以增加 数组maxlen[size](记录当前第1个点到第i个点之间的最长下降序列长度) 和maxnum[size](记录1~i之间的最长下降序列个数 ) ,首先对于最长下降序列属于DP基础题,只要对每一个a[i]求出符合要求(a[i] 在序列中,如果maxlen[j]+1 == maxlen[i]则说明a[i]和a[j]在同一个下降数列中(显然必有a原创 2011-08-19 14:22:54 · 3746 阅读 · 7 评论