动态规划
文章平均质量分 54
CN_swords
这个作者很懒,什么都没留下…
展开
-
【dp】POJ 2533 Longest Ordered Subsequence
/*基础dpN - Longest Ordered Subsequence时间: 2017/02/23题意:题解:裸LIS*/#include#include#include#include#include#include#includeusing namespace std;#define N 1010#define INF 0x3f3f3f3fint dp原创 2017-02-23 21:32:17 · 266 阅读 · 0 评论 -
【dp】HDU 1024 Max Sum Plus Plus
/*基础dpA - Max Sum Plus Plus时间: 2017/02/18题意:在一组数取出m个不相交的区间,使区间和的总和最大。题解:dp[i][j]表示前i个数,分为j个区间和的总和最大的值dp[i][j] = max(dp[i-1][j]+a[i], max(dp[0……(i-1)][j-1])+a[i]);因为dp[i][j]只和dp[][j-1]和dp[i-1][j原创 2017-02-19 20:35:06 · 238 阅读 · 0 评论 -
动态规划初步
算法竞赛入门(LJR) p259 动态规划初步/*算法竞赛入门 LRJ 数字三角形时间: 2017/02/17*/#include #include #include #include #include #include using namespace std;const int INF = 0x3f3f3f3f;const int N = 110;double原创 2017-02-17 22:30:10 · 499 阅读 · 0 评论 -
Codeforces Round #390 (Div. 2)(A,B,C(记忆化搜索),D(贪心,优先队列))
/*Codeforces Round #390 (Div. 2)时间: 2017/02/16A题题意:将集合分成几个小集合,要求小集合的和不为0.题解:遍历过去,一直到不满足集合并数字非0前生成一个集合*/#include #include #include #include #include #include using namespace std;const int原创 2017-02-16 22:36:55 · 420 阅读 · 0 评论 -
【01背包】HDU 3350 Proud Merchants
题意:需要Qi的钱才能买,Pi贵的物品,拥有Vi的价值,给你拥有的钱,求最大能拥有的价值。 题解:按照(Qi-Pi)大小来排序后,进行01背包,理由是:(Qi-Pi)大小是dp数组改变不掉的那一部分,越小的先取对后面就不会造成影响。#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#includ原创 2017-02-14 16:47:17 · 256 阅读 · 0 评论 -
【01背包求第K优解】HDU 2639 Bone Collector II
题意:01背包求第k优解 题解:因为01背包其实把所有可能的情况全列举了,取第k优解无非将数组增加一维,f[i][v][k]表示在V体积里前i个物品第k大的解。在求解过程中再每次运算时,运算k次即可,过程需要两个额外数组维护。#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <原创 2017-01-22 18:40:17 · 207 阅读 · 0 评论 -
【完全背包】UVA 147 Dollars
与E题是同种类型,我们需要将价值全部同乘上100后,再通过完全背包来解决,唯一坑点在0.00的精度问题。#include <stdio.h>#include <string.h>const int N = 30005;const int val[11] = {5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000};long long n,原创 2017-01-21 11:26:08 · 256 阅读 · 0 评论 -
【完全背包】UVA 674 Coin Change
完全背包: 有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。完全背包不同于01背包的是我们是以顺序写,这里的max中的两项当然就是当前状态的值了,为何? 因为每种背包都是无限的。当我们把i从1到N循环时,f[v]表示容量为v在前i种背包时所得的价值,这里我们要添加的不是前一原创 2017-01-21 11:20:18 · 258 阅读 · 0 评论 -
【01背包】HDU 2546 饭卡
题意:购买商品,如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。已知每种菜的价格以及卡上的余额,问最少可使卡上的余额为多少。 题解:将价格排序后,将总拥有钱-5后,进行01背包。#include <iostream>#include <stdio.h>#include <stdlib.h>#include <s原创 2017-01-21 11:33:12 · 256 阅读 · 0 评论 -
【dp】HDU 1087 Super Jumping! Jumping! Jumping!
/*基础dpE - Super Jumping! Jumping! Jumping!时间: 2017/02/20题意:最大递增子序列题解:dp[i] 表示以i为终点的递增子序列最大值dp[i] = max(dp[i],dp[j]+a[i]) {j < i}*/#include#include#include#include#include#include#includ原创 2017-02-20 20:25:36 · 216 阅读 · 0 评论 -
【dp】例题9-2 UVa 437 (HDU 1069)
/*基础dpC - Monkey and Banana时间: 2017/02/20题意:叠放立方体,使其叠的高度最大。在按底的长宽排序后,进行求最大子序列和题解:1. 在按底的长宽排序后,进行求最大子序列和2. 类似嵌套问题,记忆化搜索*/#include#include#include#include#include#include#includeusing na原创 2017-02-20 10:34:14 · 274 阅读 · 0 评论 -
【dp】POJ 1661 Help Jimmy
/*基础dpM - Help Jimmy时间: 2017/02/23题意:题解: 首先无疑的肯定要按高度进行从高到低排序,肯定有解,那么高度肯定加上去,再加上最少的横向走的时间应该有两种决策,向左跳,向右跳dp[i][0] 代表以i左边为起点向左跳到达地面的距离,dp[i][1] 代表以i右边为起点向右跳到达地面的距离如果i平台左能跳到j平台:dp[i][0] = min(dp[原创 2017-02-23 21:07:17 · 207 阅读 · 0 评论 -
【dp】HDU 1159 Common Subsequence
/*基础dpL - Common Subsequence时间: 2017/02/23题意:求最长公共子序列题解: LCS题具体的思路我在其他写51nod 1006 题解写过。简单的来讲:dp[i][j] 表示在第一序列的前i个和第二序列的前j个的最长公共子序列长度dp[i][j] = a[i] == b[j] ? dp[i-1][j-1]+1 : max(dp[i-1][j],d原创 2017-02-23 19:33:46 · 295 阅读 · 0 评论 -
【基础dp路径记录】HDU 1160 FatMouse's Speed
/*基础dpJ - FatMouse's Speed时间: 2017/02/23题意:给出n组数据,要求选择数据,证明越胖跑的越慢(即找个最长的体重严格递增而速度严格递减的数据)。题解: LIS题先按体重排序下,然后就是LIS找最长递减就好了记录路径:1. 记录终点,最后倒推回去,下面代码用的这种方式2. 直接在过程中记录:dp[i].pre = j;(或者用其他数组记录也可)原创 2017-02-23 18:46:10 · 274 阅读 · 0 评论 -
【基础dp】HDU 1260 Tickets
/*基础dpH - Tickets时间: 2017/02/23题意: n个人在买电影票,可以两个相邻的一起买,也可以单独买,给出分别需要的时间,问需要的最短时间题解: dp[i] 代表前i人的最小花费时间*/#include#include#include#include#include#include#includeusing namespace std;#def原创 2017-02-23 14:29:13 · 356 阅读 · 0 评论 -
【基础dp】HDU 1176 免费馅饼
/*基础dpG - 免费馅饼时间: 2017/02/20题意:在一个坐标轴上,最初处在5上,给出一些点在一些时间能得到1个馅饼,每秒能移动一格,问最大能得到的馅饼个数。题解:数塔问题1.预处理mp[i][j]表示在第i秒第j处能得到几个馅饼dp[i][j] 表示在前i秒,人在j处能得到最大馅饼数dp[i][j] = max(dp[i-1][j-1],dp[i-1][j],dp[i原创 2017-02-20 22:35:37 · 348 阅读 · 0 评论 -
【完全背包】HDU 1114 Piggy-Bank
/*背包dpF - Piggy-Bank时间: 2017/02/20题意:装满背包,但要求价值最低的完全背包题解:dp[i][j] 表示在背包大小为j中装前i个物品最优的价值*/#include#include#include#include#include#include#includeusing namespace std;#define N 1010#def原创 2017-02-20 20:34:16 · 376 阅读 · 0 评论 -
【基础dp】HDU 1257 最少拦截系统
/*基础dpI - 最少拦截系统时间: 2017/02/23题意:题解: dp[i] 代表第i个人使用的拦截导弹系统*/#include#include#include#include#include#include#includeusing namespace std;#define N 30010#define INF 0x3f3f3f3fint a[N]原创 2017-02-23 16:45:59 · 303 阅读 · 0 评论 -
【状压dp】HDU 1074 Doing Homework
/*状压dpD - Doing Homework时间: 2017/02/20题意:作业超过时限,超过一天扣一分,给出n个作业及其时限和需要完成的时间,求最小扣分值和其路径题解:状态压缩dp,本应该要想到的。其N<=15,所以每个状态状态转移最多15次。因为题目要求最后方案如果多个情况以字典序排序,所以可以先将原数据先排序然后我们发现递归时缺少了上一个状态的所用时间,我先预处理出来。原创 2017-02-20 16:13:55 · 314 阅读 · 0 评论 -
【区间dp】LightOJ 1025 The Specials Menu
我是弱鸡,递推式推理错误,能wa n发。 队友提点,由小区间推大区间。举一个列子理解:abca,首位和末尾是相同的,那么其区间方法数为abc区间方法数+bca区间放法数在加1(代表abca不处理);如果:abcd,首位和末尾不相同的,那么其方法数为abc方法数+bcd方法数-bc方法数(因为重复计算)。 注意:答案的范围#include <stdio.h>#include <iostream>原创 2016-10-19 21:49:59 · 280 阅读 · 0 评论 -
【类多重背包+组合数】HDU 4248 A Famous Stone Collector
hdu 4248 A Famous Stone Collector题意:给出n代表n种球,再给出n个球的数量,可以取任意几个球排列,问能排出几种不同的排列。题解:原先以为是组合数学,通过队友的提点,类似背包的做法进行操作。对于每堆进行操作。 dp[i][j]代表前i堆,组成取j个球排列的种数,那么dp[i][j] 会随着每堆的加入会变化。 dp[i][k] = (dp[i][k]+dp[i-1]原创 2016-10-16 10:11:16 · 364 阅读 · 0 评论 -
经典问题二.【区间dp】石子归并 51nod 1021
51nod 1021 石子归并(区间dp)题解:区间dp通过区间的关系操作,从小区间到大区间。 这题有点像分治一样的,我们知道如果有两个数的话,那么其值就为两数相加,如果有大于两个的数,那么通过区间的合并就能得到答案。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define INF原创 2016-10-14 22:49:23 · 281 阅读 · 0 评论 -
经典问题五.【乘号两边有正负 区间dp】Polygon poj 1179
题目描述: 思路: 因为n并不大,所以很容易想到枚举一下第一步去掉的边。 然后展开应为符号和点交杂的一条线,如果符号只有‘+’,那么用区间dp求其最优解应该很简单啦,同样小区间推大区间,dp[i][j] = dp[i][k-1]+dp[k][j].现在考虑‘’,不能向‘+’一样简单的相乘就可以,因为如果两边是负数,那么两边最小才能使值最大,那么我们在过程最小值和最大值都需要记忆化,在‘’时原创 2016-11-02 21:37:16 · 362 阅读 · 0 评论 -
经典问题四. 【区间dp】 凸多边形最优三角形划分
(区间dp) 凸多边形最优三角形划分 问题描述: 思路: 将凸多边形的点数组化。发现三角形划分是满足区间叠加的。 dp[i][j],1<=i<=j<=N,代表凸子多边形{vi-1,vi,…,vj}的最优三角剖分所对应的权函数值,即其最优值。#include <cstdio>#include <cstring>#include <algorithm>using namespace std原创 2016-11-02 19:48:10 · 1623 阅读 · 0 评论 -
经典问题三.【环形区间dp】 项链 nyoj 460
问题描述: 思路: 在了解了一点区间dp的基础上,我们知道要从小区间最优化推导到大区间最优化。 那么这题也是一样:dp[i][j] 代表区间i,j最优释放的能量。 递推式:dp[i][j] = dp[i][k]+dp[k+1][j]+a[i]*a[j+1]*a[k+1]。 至于环形问题 :我们把数组扩大一倍,对2*n堆算出dp[i][j],结果枚举dp[i][i+n-1],取最大即可。原创 2016-11-01 21:22:35 · 455 阅读 · 0 评论 -
【dp】NYOJ 90 整数划分
整数划分 (DP)解决问题: 将n划分成若干正整数之和的划分数。解决方法: dp[i][j]代表: n为i,并划分数为j以下的方法数 初始化: dp[i][j] = 0。 递推式: (dp[i][j-1]代表: 划分的数没有j; dp[i-j][j]代表: 划分的数有j) 【i > j 】 dp[i][j] = dp[i][j-1] + dp[i-j][j]; 【i == j】 dp原创 2016-10-28 21:03:30 · 414 阅读 · 0 评论 -
【DP】NYOJ 571 整数划分(三)
整数划分(三)(DP)解决问题: 问题一: 将n划分成若干正整数之和的划分数。 问题二: 将n划分成k个正整数之和的划分数。 问题三: 将n划分成最大数不超过k的划分数。 问题四: 将n划分成若干个 奇正整数之和的划分数。 问题五: 将n划分成若干不同整数之和的划分数。解决方法:解决三(一): 将n划分成最大数不超过k的划分数。(如果k == n 即是问题一) dp[i][j]代表: n原创 2016-10-28 20:55:08 · 308 阅读 · 0 评论 -
【DP】NYOJ 176 整数划分(二)
整数划分(二)(DP)解决问题: 把一个正整数m分成n个正整数的和,有多少种分法?解决方法: dp[i][j]代表: m为i,并分成j个正整数的和时的分法。 初始化: dp[i][1] = 1。 递推式: dp[i][j] = dp[i-1][j-1] (有1的情况) + dp[i-j][j] (没有1的情况)#include <cstdio>#include <cstring>#in原创 2016-10-28 14:23:51 · 394 阅读 · 0 评论 -
经典问题一.(插入乘号的整数划分)整数划分(四) nyoj 746
NYOJ 746 整数划分(四) (区间DP)解决问题: 给出一个长度为n的数,要在其中加上m-1个乘号,分成m段,使m段的乘积之和最大。解决办法: 首先预处理出: 不划分,其各个区间的值 dp[i][j] 代表: 前i位数,在划分成j段后的最大乘积和。 初始化: dp[i][1]: 不划分(即划分成1段)的时候,其值等于qujian[1][i]。 递推式: dp[i][j] = d原创 2016-10-28 11:01:42 · 720 阅读 · 0 评论 -
【类01背包】Bottles
Bottles(类01背包)题意:给你几个杯子,给出杯子的容量和杯子现有的soda量,你可以把soda从一个杯子倒到另一个杯子,花的时间是倒soda的量,问你将soda装用的最少杯子个数,在用最少杯子情况下用的最少时间。题解:我们可以快速推出需要最少杯子的个数,即往大容量的杯子里装。再得出最少杯子个数后,如果我们能确定这几个杯子,那么将这几个杯子的原有soda量算出来,用总的soda量一减就是答案。原创 2016-10-27 09:24:55 · 480 阅读 · 0 评论 -
经典问题六.【二维的区间dp】棋盘分割 poj 1191
问题描述: 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行) 思路: dp[i][x1][y1][x2][y2] 代表从(x1,y1)到(x2,y2)的矩形划分成i块的最优平方和 递推分四种情况: #include <cstdio>原创 2016-11-03 22:37:50 · 384 阅读 · 0 评论 -
【区间dp】LightOJ 1422 Halloween Costumes
/*date: 2016/11/5writer: CN_swords题意:给你n天分别要穿的衣服,可以套着穿,但是一旦脱下来就不能再穿了,问这n天要准备几件衣服。题解:dp[i][j] 代表i天到j天最少需要准备的衣服;如果求dp[i][j],在(i+1,j)的区间内如果不考虑与i天一样的衣服,那么dp[i][j] = dp[i+1][j]+1;如果找到k天与i天一样,我们可以把i天的原创 2016-11-05 11:50:00 · 229 阅读 · 0 评论 -
【01背包求方案】UVA 624 CD
题意: 将一定数量的CD里的歌录到一定体积的录音机里,使得录音机空间利用最大,求选择的CD,和其利用的空间大小。 题解: 这是需要输出方案的01背包,和最大的利用空间的答案。首先我们将CD所用空间抽象为花费,将1抽象为价值,进行01背包即可解决最大利用空间的答案,输出方案我们需要增加一个记录数组g[i][W] ;在求最优方案的过程中, 当 f[j-v[i]] >= 0 && f[j-v[i]]+原创 2017-01-21 11:05:53 · 280 阅读 · 0 评论 -
【01背包变形】POJ 2184 Cow Exhibition
题意: 给出num头奶牛的Si和Fi值,要求在这几头奶牛中选出若干头,使得在其总S值TS和总F值TF均不为负的前提下,求最大的TS+TF值 题解: 将Si看作体积,将Fi看作价值,我们知道V最大不超过(100*1000),我们可以用01背包求得在最大体积上的最大价值。此外此题有负数,我们将所有数据+(100*1000),那么初始化起点则为f[100*1000] = 0,其他均为 -INF,还有一点原创 2017-01-19 22:56:16 · 275 阅读 · 0 评论 -
【01背包】POJ 3624 Charm Bracelet
题意: 对于N个物品(只能取一次),在给定的载重W下,最多能装下价值最大为多少。01背包:dp[i][j],其i表示在取i物品时,j表示背包空余容量,值表示现在背包拥有的价值。 在状态转移的过程中,在没取第i个背包之前,值为dp[i-1][j],然而有俩种情况(正如其名称)取这个物品还是不取。 取:dp[i-1][j-v[i]]+w[i],不取: dp[i-1][j].#include <i原创 2017-01-19 22:39:58 · 241 阅读 · 0 评论 -
【区间dp】HDU 2476 String painter
/*data: 2016/11/08writer: cn_swords题意:给你A,B两字符串,你一次操作可以将A一段全变为一个字符,问你最小次数把A变成B。题解:dp[l][r]代表区间(l,r)里,最小次数把这个区间的A变成B。当检查l位置A与B的时候,如果相同,dp[l][r] = dp[l+1][r];如果不同,初始化dp[l][r] = dp[l+1][r]+1,然后需要在原创 2016-11-08 21:25:19 · 319 阅读 · 0 评论 -
【区间dp】HDU 4283 You Are the One
/*data: 2016/11/08writer: cn_swords题意:有n个男按顺序排好,每个人都有一个值D[i],如果第i个人第k个上台找对象,那么该男的不开心值就会为(k-1)*D[i],小黑屋是个栈,上台顺序可以通过小黑屋改变,求最小不开心值;题解:dp[l][r]代表区间(l,r)里,最小的不开心值,dp[l][r],寻找一个k,让第l人第k个上场,使得dp[l][r]取得原创 2016-11-08 20:30:06 · 214 阅读 · 0 评论 -
【区间DP】POJ 1651 Multiplication Puzzle
POJ 1651 Multiplication Puzzle(区间DP)/*题意:给你n长度的序列,可以移除一个非首和尾的数,将数和左右两边的数相乘,要求移除完后和最小。题解:区间(l,r)可以取区间中间的k(代表区间最后取的数)枚举取最小,dp[l][r] = dp[l][k]+dp[k][r]+a[k]*a[l]*a[r];*/#include <cstdio>#include原创 2016-11-07 22:30:31 · 245 阅读 · 0 评论 -
【记忆化搜索区间dp】CodeForces 149D Coloring Brackets
/*date: 2016/11/5writer: CN_swords题意:给一个给定括号序列,给该括号上色,上色有三个要求1、只有三种上色方案,不上色,上红色,上蓝色2、每对括号必须只能给其中的一个上色3、相邻的两个不能上同色,可以都不上色问上色的方法数?题解:设: 0表示不上色;1表示上红色;2表示上蓝色。dp[i][j][x][y] 代表区间(i,j)上,i位置上x颜色,l位置原创 2016-11-05 20:44:05 · 260 阅读 · 0 评论 -
【区间dp】POJ 2955 Brackets
/*date: 2016/11/5writer: CN_swords题意:给你一个字符串,寻找最长的匹配串的长度。题解:定义:dp[i][j] 代表区间(i,j)最长匹配串的长度; 初始化: dp[i][j] = 0;对于dp[i][j],在(i+1,j)区间如果没找到与i匹配的字符,dp[i][j] = dp[i+1][j];在(i+1,j)区间如果找到与i匹配的字符,位置为k,那么原创 2016-11-05 11:53:22 · 205 阅读 · 0 评论