![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
——动态规划——
文章平均质量分 85
chen_minghui
这个作者很懒,什么都没留下…
展开
-
codeforces 812B Sagheer, the Hausmeister dp
参考某大佬的思路:dp[I][0/1]表示已经灭掉第I层的灯,并且在第I层的左/右端#include#include#includeusing namespace std;const int maxn = 20;const int maxm = 110;int L[maxm],R[maxm];int dp[maxn][2];int main(){ int n,m; cha原创 2017-06-04 21:09:06 · 301 阅读 · 0 评论 -
hdu 1503 Advanced Fruits 打印LCS模板
题意:打印两个串,但是LCS只打印一次#include#include#includeusing namespace std;char a[110],b[110];int dp[110][110];char m[110][110];void Find(int i,int j){ if(i==0&&j==0)return; if(m[i][j]=='\\') { Fin原创 2017-07-11 19:33:12 · 180 阅读 · 0 评论 -
hdu 1243 反恐训练营 LCS变形
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1243思路:LCS简单变形。LCS模板:http://blog.csdn.net/chen_minghui/article/details/71773817各种坑,用memset MLE ,不给数据范围。给跪了#include#include#include#include#incl原创 2017-07-11 16:58:45 · 329 阅读 · 0 评论 -
poj 1159 Common Subsequence LCS模板
题意:给两个串,求出他们LCS的长度LCS(Longest Common Subsequence)最长公共子序列:一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列X={x1,x2,x3...xn},Y={y1,y2,y3...ym} ,令Z={z1,z2,z3...zk}是他们的LCSi=1,2,3,4.原创 2017-05-12 22:01:56 · 277 阅读 · 0 评论 -
hdu poj 1080 Human Gene Functions LCS 动态规划
题意:给定两DNA序列,在序列中任意位置可以插入-和另外一个碱基匹配,每种匹配有个分值,求匹配的最大分值思路:用dp[I][j]代表放a中第I个,与放b中第j个字符时的最大分值。什么都不放dp[0][0]=0在a前面加上与b长度相同的‘-’,与b全部匹配dp[0][I]=dp[0][I-1]+map[4][a[I-1] (1=在b前面加上与a长度相同的'-',与a全部匹配原创 2017-04-19 20:29:30 · 262 阅读 · 0 评论 -
hdu 2159 FATE 二维完全背包
思路:不能用经验作背包,因为获得的经验可以超过升级的经验。有两个限制条件1.杀怪的总数量。2.拥有的疲劳值。#include#include#includeusing namespace std;int dp[110][110];//数量 疲劳值 最大经验 int a[110],b[110];// 获得的经验 减去的疲劳值 int main(){ int n,m,k,s;原创 2017-07-11 15:39:23 · 218 阅读 · 0 评论 -
hdu 1963 Investment 完全背包
题意:某人有一些钱,可以用钱去银行购买债券,用来获得利息。给定购买的年数,每年可以更换购买的债券类型。给定一些债券的价格(是1000的整数倍)和可以获得的利息。年数到时可以获得的钱数的最大值。思路:价值总是1000的倍数,就可以用1个单位代表1000.数组就可以开得下了。#include#include#includeusing namespace std;const int ma原创 2017-07-11 10:15:14 · 228 阅读 · 0 评论 -
hdu 1248 寒冰王座 完全背包
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1248思路:完全背包模板#include#include#includeusing namespace std;const int maxn=10010;int dp[maxn];int main(){ int a[3],t; a[0]=150;a[1]=200;a[2]=350;原创 2017-07-11 09:11:45 · 263 阅读 · 0 评论 -
uva624 CD 01背包+输出路径
题意:将CD中的歌曲复制到胶卷中,胶卷最多容纳N分钟,给出CD中歌曲的数量和每一首歌的持续时间体积和价值贡献一样大的01背包路径输出:在选择第I件物品是从前I-1个物品这个子问题推出来的,如果f[I][j]>f[I-1][j]说明是选择了第I件物品,用一个数字path[I]记录#include#includeusing namespace std;int f[21][2100];原创 2016-10-17 23:04:30 · 395 阅读 · 0 评论 -
CodeForces 106C Buns 多重背包
题意:有n克生面粉,m种馅。每种馅含有ai,克,每一种馅可以拿出bi克馅与ci克面粉制成一种面包,获得di的价值。生面粉可以拿出c0克制成馒头,获得d0价格。给定n,m,c0,d0.和馅的信息。问可以得到的最大价值思路:直接套多重背包模型。#include#include#includeusing namespace std;const int maxn = 20;int dp[原创 2017-07-13 18:23:08 · 296 阅读 · 0 评论 -
51nod 1007 正整数分组 01背包
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1007 思路:先求出总和,然后用总和的一半作背包体积,看全部数能够装多少。然后拿总和减去已装的,得到另一半有多少。#include<cstdio>#include<queue>#include<iostream>#include<vector>#incl原创 2017-08-07 22:49:28 · 237 阅读 · 0 评论 -
51nod 1031 骨牌覆盖 斐波那契数列
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1031 思路:没次增加时要么是最后添加竖的一块,要么是横的一块,宽度占掉2,可以从之前的状态转换过来#include<cstdio>#include<queue>#include<iostream>#include<vector>#include<map原创 2017-08-07 22:52:11 · 251 阅读 · 0 评论 -
Codeforces 429B B. Working out dp
题意:给n*m的矩阵,每个格子有个数,A从(1,1)出发只能向下或右走,终点为(n,m),B从(n,1)出发只能向上或右走,终点为(1,m)。两个人会在某处相遇,求出除了相遇点外,他们两个路径之和的最大值(相遇点不算作距离)思路:dp0[I][j]表示从左上角走到(I,j)的最大距离dp1[I][j]表示从左下角走到(I,j)的最大距离dp2[I][j]表示从右上角走到(I,j)的原创 2017-06-05 20:38:53 · 281 阅读 · 0 评论 -
hdu 6201 transaction transaction transaction 树形dp
题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=6201题意又是利用不同地方物价不同,赚得差价,这道题起点和终点可以任选,但是需要路费。从一颗树中,任选起点和终点,利润为差价减去路费。求最大利润思路用dp[u][0] :表示在u点买进时能够获得的最大价值 用dp[u][1] :表示在u点卖出时能够获得的最大价值 转移过程可以看代码#incl原创 2017-10-13 13:49:53 · 200 阅读 · 0 评论 -
fzu 2216 The Longest Straight 二分
题目链接http://acm.fzu.edu.cn/problem.php?pid=2216题意给出n张牌,每张牌有个数值,n张牌中最大的值为m。值为0的牌可以代替任意值,问可以凑出最长顺子的长度是多少。思路用dp[i] 表示从1到j需要填0的个数 dp[j] - d[i] 表示 i+1 到 j需要填0的个数 然后mlogm 枚举#include<cstdio>#include<iost原创 2017-10-06 13:31:36 · 176 阅读 · 0 评论 -
HDU 2196 Computer 树形dp
题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=2196题意给定一颗树,求出每个点到树上任一点的最大距离。 dp[u][0] 和dp[u][1]分别表示u在以u为根结点的子树中,u能走到的最大距离和次大距离 dp[u][2] 表示u往其父节点走能走到的最大距离#include<cstdio>#include<iostream>#incl原创 2017-10-10 15:02:51 · 166 阅读 · 0 评论 -
hdu 1142 A Walk Through the Forest 最短路+记忆化搜索
题意:每天下班后,某人都要从他的办公室,深林的一端,结点编号为1,走到深林的另一端,结点编号为2,为了放松心情,并且能尽快到家,他想知道有多少路满足条件的路能够到家。条件:当前在A点,与A相连的B点如果满足,A到2的最短距离大于B到2的最短距离,那么A可以从B走,否则不能走。按照这样的规则走到终点,算一条路径,一开始也以为是求最短路的条数= =思路:dijstra求最短路,然后记忆化搜索原创 2017-04-17 20:50:57 · 324 阅读 · 0 评论 -
POJ 3592 Instantaneous Transference 强连通缩点+dp最长路
题目链接:http://poj.org/problem?id=3592题意在一个n*m的方格中,方格可以填三种类型的字符, 1.数字 2.’*’ 3.’#’ 数字代表他到达这儿所能获得的价值,*表示这点为传输机,走到这儿可以选择传送与它绑定的某个点,#代表墙壁,不能走到这儿。一个人从左上角走到右下角,在每个点只能往下或往右,在传输机位置处,可以选择传送或不传送,每个点的价值只能获得一次,问原创 2017-08-18 20:28:27 · 204 阅读 · 0 评论 -
51nod 1183 编辑距离 dp
题目:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离:https://baike.baidu.com/item/%E7%BC%96%E8%BE%91%E8%B7%9D%E7%A6%BB/8010193?fr=aladdin#include<cstdio>#include<queue>#includ原创 2017-07-31 20:59:57 · 193 阅读 · 0 评论 -
51nod 1050 循环数组最大子段和
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050#include<cstdio>// 两种情况:1.最大和出现在1~n之间。2.最大和出现在首尾相接处 #include<queue>// 出现2的情况时由于序列中间部分的数值偏小 #include<iostream>#include<vector>原创 2017-08-08 09:34:06 · 150 阅读 · 0 评论 -
POJ3624 Charm Bracelet 01背包模板(一维)
简单得01背包问题,题目得数据量大,二维数组表示爆内存#includeusing namespace std;const int V=12881;const int N=3403;int w[N]={0},c[N]={0};int f[V];void pack(int n,int m){ for(int i=1;i<=n;i++) for(int v=V;v>=0;v--)原创 2016-10-09 18:48:05 · 323 阅读 · 0 评论 -
Codeforces 189A. Cut Ribbon 完全背包
题意:一块长度为n的布条,要求每次切断都必须要含有a,b,c三个长度的两种,问最多可以切多少块用一维数组表示状态,表示体积的初始条件为第i个物品,除了f[0]用0初始化外,其余的均用无穷小初始化,表示处于未定义的状态代码不是很理解。#include#includeusing namespace std;int main(){ int n; int f[4001]; f[0原创 2016-10-19 19:22:30 · 313 阅读 · 0 评论 -
hdu 1114 Piggy-Bank(完全背包) dag边权之和最小
.完全背包装满,背包价值最小问题。,除了dp[0]=0,其余均初始化为无穷大完全.完全背包装满,背包价值最小问题,除了dp[0] = 0,其余均初始化为无穷大小,这题属于第一类题意:程序首先有一个测试次数,然后储钱罐的初始质量和装满钱币的质量,之后输入的是钱币的种类,接下是每种钱币的价值和质量,求将储钱罐装到输入的质量,获得的价值最小为多少,如果不能装满(不符题意),输出This is i原创 2016-10-31 22:33:26 · 316 阅读 · 0 评论 -
uva 1347 tour
题意:一飞行员从最左端的某点一直往右边移动,到了最右端又返回到最左端,要求除了最左最右两端点可以重复外,其余点只经过一次,求最短路径,每一个点以坐标形式给出(从左到右),距离为他们间的欧几里得距离的平方。#include#include#include#define Min(a,b) a<b?a:busing namespace std;const int maxn = 1010;原创 2017-03-24 08:13:09 · 241 阅读 · 0 评论 -
codeforces 797e Array Queries 部分dp+暴力
题意:一个长度为n的数组,ai ,1=思路:部分dp,k较大时,路径较短,可以暴力,k较小时,路径可能很深,记忆化搜索.#include#includeusing namespace std;const int maxn = 100010;int a[maxn];int f[maxn][420];int n;int dfs(int q,int k){ if(q>n)ret原创 2017-05-01 20:50:10 · 324 阅读 · 0 评论 -
788A - Functions again 最大连续子序列和
题意:给一个公式,(1 ≤ l r ≤ n),(1=思路:令b[I] = | a[I]-a[I+1] | ,可以发现f(l,r)的最大值要么在 {b1,-b2,+b3,... ,(+ or -) bn-1},要么在{-b1,b2,-b3,b4,...,(- or +) bn-1 }中,两个序列中最大连续子序列和较大者为答案#include#include#include#defin原创 2017-05-23 09:38:31 · 297 阅读 · 0 评论 -
多重背包 hdu2191 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活
题意:没见物品消耗空间c[I],贡献w[I],数量num[I],求最大值#include#includeusing namespace std;const int N =2000;int dp[2001],n,m;int c[101],w[101],num[101];int Max(int a,int b){ return a>b?a:b;}void pack(){原创 2016-10-22 18:05:13 · 390 阅读 · 0 评论 -
hdu 1520 Anniversary party 树状dp
题意:在一个大学庆典中,从n个职工中选择一些人来参加派对,这n个人上司与下属关系形成一颗树,每个人都有一个对应的funny值,为了使派对更加有趣,要求上司与其直接下属不能同时参加派对,并使派对的funny值最大.还以为是图,问题想复杂了#include#include#include#define Max(a,b) a>b?a:busing namespace std;const原创 2017-03-14 12:35:57 · 210 阅读 · 0 评论 -
hdu 1208 Pascal's Travels 记忆化搜索
题意:一个矩阵中的每个格子含有一个0~9的整数,代表可以向右或向下移动的步数,求得从左上角到右下角有多少条路。题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1208分析:用dij代表从(I,j)出发走到终点的路径数简单的一道题,wa几次#include#include#include#define Max(a,b) a>b?a:原创 2017-03-13 20:37:28 · 260 阅读 · 0 评论 -
poj 1088 滑雪 动态规划
题意:给定一个图,每个点有一个高度值,某人在这个区域滑雪,只能从高处向低处,要求出他滑雪的最大路径,先输入行数和列数,随后是一个矩阵#includeusing namespace std;int map[101][101],dp[101][101];int R,C;int Max(int a,int b,int c,int d){ int a1 = a>b?a:b; int a2原创 2016-11-14 19:56:59 · 203 阅读 · 0 评论 -
通过金矿模型介绍动态规划
看了很受启发,感谢原作者,原文:http://www.cnblogs.com/sdjl/articles/1274312.html----第一节----初识动态规划-------- 经典的01背包问题是这样的: 有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放在包里而物品体积总数不超过包的容量m时,能转载 2016-11-03 19:35:27 · 416 阅读 · 0 评论 -
hdu 1619 Unidirectional TSP 记忆化搜索
题意:一个n*m的矩阵,从第一列任意位置处出发,求走到最右端的最小权重值。往右走的规则为,对角线和水平方向都可以,如果超过最上面,则认为与下面相邻,如果超过最下面,则认为与最上面相邻.有些类似树塔,每个位置都有一个dp[I][j],代表从当前点走到最右方需要的最少步数,据说是《算法竞赛入门经典》中的例题,打印路径为书上的代码,自己写的太长了#include#include#includ原创 2017-03-14 23:00:00 · 584 阅读 · 0 评论 -
hdu 1078 FatMouse and Cheese
题意:有n*n大小的网格,每个格子中有一定量的奶酪,一只老鼠从(0,0)开始沿着水平和垂直两个方向走,并且要求目标格子的奶酪数目大于当前格子的奶酪数,每次最多走k格,问到它无法走动时,获得的奶酪的最大数目是多少题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078#include#include#define Max(a,b) a>b?a原创 2017-03-12 20:20:34 · 191 阅读 · 0 评论 -
POJ-2241 uva 437 The Tower of Babylon 记忆化搜索 DAG最长路
题意链接:http://poj.org/problem?id=2241题意:有n种不同类型的“块”,每种块有无数多个,“块”是一个立方体,有三个边长度为x,y,z。现在要搭建一个塔,要求是使得塔的高度最高,并且上下两块砖,上底面能够含于下底面。假设底面边长分别为a,b 和c,d ,(a,b)要含于(c,d)需满足:a#include#include#include#define原创 2017-03-05 19:28:54 · 262 阅读 · 0 评论 -
hdu 3496 Watch The Movie 二维01背包
题意:有n个电影光盘,每张光盘看完需要一些花时间并且能获得一些happy值。很奇怪但是商家只愿意出售m张。并且观看得总时间有限。求能够把m张看完,并且获得最大的happy值。如果不能看完m张光盘,那就输出0。思路:普通的01背包变形,这里有两个限制条件。一是背包体积有限,二是从n中挑选m个满足条件的。#include#include#includeusing namespace st原创 2017-07-10 21:44:19 · 282 阅读 · 0 评论 -
hdu 4489 The King’s Ups and Downs 组合 递推
题意:给定n个个数1~n。要求他们排成一列满足“波浪型”。第一个大于第二个,第二大于第三个,(或者第一个小于第二个,第二个小于第三个。。)也就是相对的高矮高矮。。。或矮高矮高。。依此类推。求排列总方案数思路:考虑第I个数,加入已经排好I-1个数的序列中,要怎样放第I个数才能使新的序列合法呢?I是大于前I-1所有的数,放到任意位置都是“高”。所以I插入的这个位置前面的一个数必须相对它前面的数是“原创 2017-06-07 21:05:15 · 541 阅读 · 0 评论 -
hdu 2044 一只小蜜蜂... dp
思路:由图可知,用d[I]带表两个点相距为I的方法总数,在n可以走到n+1,n+2两个格子。反过来,在n可以由n-1,和n-2走一步过来。所以f[n]=f[n-1]+f[n-2].#include#define ll long longll d[52];int main(){ d[1]=1; d[2]=1;//相距为1 1种方法 d[3]=2;//相距为2 2种方法 for原创 2017-06-06 20:39:08 · 431 阅读 · 0 评论 -
hdu 1864 最大报销额
题意:拿发票去报销,发票能够报销的条件是只能含有ABC三类物品,并且一类物品的价格总和不超过600,一张发票的三类物品价格总和不超1000,选出一些发票使其能够报销最多。思路:01背包,但是体积不是int,由于总是保留两位小数,将体积扩大100倍,当作int处理#include#include#include#includeusing namespace std;int w[40原创 2017-06-16 21:04:33 · 224 阅读 · 0 评论 -
hdu 2602 Bone Collector 01背包
基本的01背包:但有个地方特坑爹,骨头可以体积为0,价值不为零,用二维数组写,仅仅差了一个数字,交了几次都WA,一维和二维差别很小。1,体积循环二维背包从零到n,一维从n到0。2.二维中的dp[I][j]相当于一维的dp[j],d[I-1][j-w[I]]相当于d[j-w[I]]二维:#include#includeusing namespace std;const int原创 2016-10-20 21:12:48 · 220 阅读 · 0 评论 -
算法导论:动态规划 切钢条问题
问题描述:不同长度的钢条,具有不同的价值,而切割工序没有成本支出,公司管理层希望知道最佳切割方案,假定钢条的长度均为整数:用数组v[I]表示钢条长度为I所具有的价值v[] = {0,1,5,8,9,10,17,17,20,24,30};用r[I]表示长度为I的钢条能获取的最大价值,通过观察可以知道,r[1] = 1(无切割),r[2] = 2(无切割),r[3] = 3(无切割),r[4] = 1原创 2016-11-05 11:18:59 · 2760 阅读 · 1 评论