ACM_动态规划
文章平均质量分 69
tagyona
独立思考。不论是做题,还是人生。
展开
-
用动态规划法解题的一般模式
动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。如图所示。动态规划的设计都有着一定的模式,一般要经历以下几个步骤。┌───┐┌───┐┌───┐初始状态→│决策1│→│决策2│→…→│决策n│→结束状态└───┘转载 2013-03-14 14:18:24 · 1887 阅读 · 0 评论 -
POJ 1155 TELE(树形DP)
第一道没看题解写出来的树形DP,纪念一下。,#include #include #include using namespace std;const int maxn = 3000+5;int head[maxn],pay[maxn],n,m;bool vis[maxn];#define INF 0x3f3f3f3fint pnt[2*maxn],nxt[2*maxn],cst原创 2014-01-04 20:34:25 · 640 阅读 · 0 评论 -
FZU 2056 最大正方形
一直没想到合适的处理方式,又看了题解。(不算原创了-_-#)以dp[i][j]为存储左上角矩形的全部元素和: dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+a[i][j]然后从大到小枚举正方形边长,利用s=dp[i][j]-d[i-h][j]-dp[i][j-h]+dp[i-h][j-h](画个图很容易得到)计算以(i,原创 2013-05-13 19:45:14 · 933 阅读 · 0 评论 -
FZU 2013 A short problem(DP)
DP[i]表示以i结尾长度大于等于m的最大和。#include #include #include using namespace std;const int maxn=1000000+5;int a[maxn],dp[maxn];int main(){ int T; scanf("%d",&T); while(T--){ int n,原创 2013-05-11 22:12:48 · 703 阅读 · 0 评论 -
POJ 1088 滑雪(DP+记忆化搜索)
直接参考了discuss后面的代码。int DP(int i,int j){ int Max=0; if(dp[i][j]) return dp[i][j]; if(j>=1){ if(g[i][j]>g[i][j-1]){ if(Max<DP(i,j-1)) Max=DP(i,j-1);转载 2013-05-10 23:37:42 · 654 阅读 · 0 评论 -
HDU 1081 To The Max(最大子矩阵和)
http://acm.hdu.edu.cn/showproblem.php?pid=1081给出一个矩阵,求其子矩阵的最大和。枚举矩阵的上下界,将其内所有元素压缩到一个数组中。对数组求最大连续和,即子矩阵的最大连续和。找出最大的即可。#include #include #include using namespace std;const int maxn =100+5;i原创 2013-05-08 20:09:17 · 460 阅读 · 0 评论 -
HDU 2845 Beans (DP)
http://acm.hdu.edu.cn/showproblem.php?pid=2845还是没忍住看了别人的解题报告......2次DP:第一次求出每行能得到的最大值,第二次求出总的最大值。dp[i][0]表示第i个不取能得到的最大值,dp[i][1]表示第i个取能得到的最大值。#include #include using namespace std;const int m原创 2013-05-05 13:44:04 · 515 阅读 · 0 评论 -
HDU 1025 Constructing Roads In JGShining's Kingdom(最长上升子序列+n*logn算法)
要求没有两根线交叉的最多道路,因为每个p只对应于一个r.所以只要满足是上升序列,其线段一定不会交叉。以前只会O(n^2)算法,这道题目测会跪,研究了网上的解题报告,又涨姿势了-_-#dp[i]存储长度为i的序列末尾元素的最小值。关键在于二分查找。#include #include using namespace std;const int maxn =500000+5;原创 2013-05-15 18:39:18 · 548 阅读 · 0 评论 -
HDU 1026 Ignatius and the Princess I(记忆化搜索)
广搜习惯了用队列,遇到一道输出路径的题就卡了。其实可以用数组来模拟队列,用DP的方法来求从终点到起点的最小值,这就是所谓的记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。别人的代码我就不贴原创了,支持正版。#include #include #include using namespace std;const int inf=100000转载 2013-04-14 19:30:25 · 898 阅读 · 0 评论 -
HDU 4540 威威猫系列故事——打地鼠(DP)
简单DP题。dp[i][j]表示第i时刻打第J个位置所能消耗的最小能量。#include #include using namespace std;const int maxn=20+5;const int inf=10000000;int dp[maxn][maxn],a[maxn][maxn];int main(){ int n,k; while(~s原创 2013-04-03 19:01:53 · 953 阅读 · 0 评论 -
HDU 1257 (最大上升子序列)
思路:求最大上升子序列:由于是每套拦截系统以后每一发炮弹都不能超过前一发的高度,所以对于后面一发比前面高的炮弹,必须需要新的拦截系统来处理(击下前面较低炮弹的系统已经无法拦截)。所以需要的拦截系统数量至少是最大上升子序列的长度。#include using namespace std;const int maxn=10000+10;int a[maxn],dp[maxn];int原创 2013-03-12 14:30:21 · 714 阅读 · 0 评论 -
HDU 4507 吉哥系列故事——恨7不成妻(数位DP)
第一次一道题做了3天才A掉,但是收获还是蛮大的。鉴于前面刷的模板题都是求区间内有多个满足题意或不满足的题意的,这道题想了很久。昨天上午想到用和与平方和来一起维护,但是一开始想到用dp[pos][ans1][ans2]表示区间内与7有关的数的平方和,然后用容斥原理。昨天wa了几遍,今天早上才意识到这样写很多地方不能处理,最后改成dp[pos][ans1][ans2]表示区间内与7无关的数的平原创 2014-03-01 16:50:55 · 713 阅读 · 0 评论