![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法_动态规划
勤勤勤能补拙
心似骄阳万丈光
展开
-
leetcode5130 最小的必要团队
题目大意:收集最少的人,让这些人能够覆盖 所有的技能。思路:状态压缩 +动态规划dp (状态压缩只是一个概念,就是考虑如何用1个数字去表示一个状态,方便我们将这个数字作为dp数组的下标。)举例:比如说 全部技能有:{'java','csharp'} ,对应数组的下标是{0,1} ;1. 先说为什么状态压缩,如何状态压缩:因为题目的技能数目<=16,这很重要,要对数值大小很敏...原创 2019-07-16 09:56:10 · 2761 阅读 · 2 评论 -
poj1014 Dividing(多重背包的二进制优化)
原题: http://poj.org/problem?id=1014一开始知道是多重背包,然后自己弄成01背包就交了,结果超时,所以百度后才知道需要用二进制优化举个例子,假如说物品i有10个,单价为 2,而最后的最优结果取i是7个。传统的做法就是直接化成01背包,也就是把10个物品i看成10个一模一样的物品(w=1,v=2)然后送去dp改良的方法就是压缩这个数量10: 我们可以把数量1原创 2017-11-12 10:20:52 · 230 阅读 · 0 评论 -
Game Of Sum(区间dp)
原题: https://vjudge.net/problem/UVA-10891大致题意: 有一个游戏,A和B两个玩家,还有一串数字,每个玩家每次可以从这串数的左边或者右边取一个或者几个连续的数,规定A先取,然后轮到B,依次交替,直到所有的数都取完,计算A和B各自拿到的数的和,计算得出结果A-B。这个取的过程规定 A和B都十分聪明, 每次都保证使自己拿到的数的和尽量最大!没想出来,很失原创 2017-11-09 23:56:26 · 246 阅读 · 0 评论 -
hdu1950 poj1631 Bridging signals(n*logn的最长递增子序列)
最长递增自序列: http://www.cnblogs.com/lonelycatcher/archive/2011/07/28/2119123.html//在为dp[i]找上一个状态dp[j]时,用常规顺序搜索会超时,要改用用二分。 #include#includeusing namespace std;int max(int a,int b){ if(a>=b)return原创 2017-08-25 11:33:28 · 202 阅读 · 0 评论 -
poj2029 Get Many Persimmon Trees
原题: http://poj.org/problem?id=2029思路: 类似求矩阵中 最大子矩阵和, 在合并s行后, 求连续 t 个元素的最大和#include#includeint main(){ int n; const int size=101; scanf("%d",&n); while(n!=0) { int dp[size][size]={0};原创 2017-09-12 21:10:17 · 228 阅读 · 0 评论 -
poj1609 Tiling Up Blocks
原题: http://poj.org/problem?id=1609题目大意: 有一些块,每个块有两个参数li mi, 如果有块1(l1,m1),块2(l2,m2),如果满足l1>=l2 && m1>=m2 块1就可以叠在块2上面,反块2能叠放在块1上面,问有n个块,最多能叠多少个块......先根据li从小到大排序,再按mi从小到大排序,对 mi 求最长不递减子序列顺便复习了二分求 最长原创 2018-05-17 12:38:23 · 185 阅读 · 0 评论 -
poj1189 钉子和小球
原题: http://poj.org/problem?id=1189//关键在于输入的处理以及运算过程中的 约分,约分可以保证每一次计算的结果都在long long的范围内,否则爆了会导致错误的结果 //定义结构体,并重载+和/运算符 //转移方程:如果字符是'*',则dp[i+1][c]=dp[i+1][c]+dp[i][c]/2;dp[i+1][c+1]=dp[i+1][c+1]+原创 2018-05-17 12:39:09 · 286 阅读 · 0 评论 -
poj1975 Median Weight Bead(floyd || 暴搜)
原题: http://poj.org/problem?id=1975这题一开始没有想到floyd,就去搜索,结果还过了,虽然时间很长用了200+ms,但也是挺爽,后来去查才知道floyd才是解题方案,下面是两种方法其实佛洛依德很好用,可以存负权值边而且代码很容易记住,就是复杂度有点高,要记住....求任意两点的最短路,或者关系,首选floydfloyd 16ms#include原创 2017-09-10 08:34:50 · 253 阅读 · 0 评论 -
poj 2181 Jumping Cows
原题: http://poj.org/problem?id=2181思路:有p个数,每个数都是正数,从左到右 每次我们可以从中选1个数,在第偶数次选中的数,我们要减去arr[i],在奇数次选中的数,我们可以加上它arr[i],问最后能够得到的结果最大是多少?思路:ou[i]表示前i个取偶数个的得到最大值 , ji[i]表示前i个取奇数个的得到的最大值如果第i个数是奇数次被选到的原创 2017-09-16 16:30:51 · 257 阅读 · 0 评论 -
poj2231 Moo Volume
原题:http://poj.org/problem?id=2231思路: dp[i]表示前i个location的Volume值,将输入数字排序,根据规律推出转移方程:dp[i]=dp[i-1]+(i-1)*2*(a[i]-a[i-1]);#include#includeusing namespace std;typedef long long ll;int cmp(const原创 2017-09-23 07:43:22 · 205 阅读 · 0 评论 -
poj2192 Zipper
原题: http://poj.org/problem?id=2192思路:设字符串str1,最后一个字符是c1,长度为len1;字符串str2,最后一个字符是c2,长度为len2;合并结果为str3,最后一个字符是c3,长度为len3;我们比较c1,c2,c3;如果str3是由str1,str2合并而来,那么只有两种情况①c1==c3 ,str1的前len1-1个字符和st原创 2017-08-27 16:16:05 · 265 阅读 · 0 评论 -
hdu2639 Bone Collector II (01背包第k优解模版)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=2639在01背包上多加一维 [k] 表示该状态的第k个最优解#includeint main(){ int t; scanf("%d",&t); while(t--) { int n,m,k; int v[101];原创 2017-11-12 21:56:10 · 205 阅读 · 0 评论 -
poj2018 Best Cow Fences(求至少k个连续数 使得平均值最大)
原题: http://poj.org/problem?id=2018题意:找至少连续的k个数,使得这k个数的平均值最大.思路:用两个数组 f[i] num[i], 表示对于第i个数,我们取i(包括arr[i])之前连续num[i]个数,得到和为f[i], 可以使得平均值最大。情况一: f[i]=f[-1]+arr[i] num[i]=num[i-1]+1 表示我们把这个数ar原创 2017-09-12 19:39:12 · 2002 阅读 · 0 评论 -
hdu 1712 ACboy needs your help(分组背包模版)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1712//分组背包//dp[k][v]表示前k组物品花费费用v能取得的最大权值 //dp[k][v] = max(dp[k-1][v],dp[k-1][v-Ci]+Wi)| i= 1..group[k]); #includeint max(int a,int b){ if(a>=b)r原创 2017-11-14 21:12:21 · 184 阅读 · 0 评论 -
leetcode1015 至少有1位重复的数字
题目链接:https://leetcode-cn.com/problems/numbers-with-repeated-digits/题目内容:给定正整数N,返回小于等于N且具有至少 1 位重复数字的正整数。思路:看到题目,求范围内出现某类数字的个数,思路应该是数位dp的方向。关于数位dp是什么,这篇博客十分清楚地介绍了:https://blog.csdn.net/wust...原创 2019-03-17 22:43:06 · 2899 阅读 · 0 评论 -
leetcode312 戳气球
题目:https://leetcode-cn.com/problems/burst-balloons/思路:动态规划状态:dp[i][j] 表示戳破[i,j]范围内这些气球所能获得的最大数量的硬币转移方程: dp[i][j] = max(dp[i][j],dp[i][k-1] + dp[k+1][j] + arr[i-1]*arr[k]*arr[j+1]); (i<=k<...原创 2019-03-13 21:45:57 · 1214 阅读 · 0 评论 -
hdu2606 Renovation Problem(递推)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2606题意:有四种砖规格分别是 1*1 2*2 3*3 4*4,现在已知一个4*n的矩形,问刚好铺满这个矩形有多少种方案?解题:题目说的是4*n的矩形,我把矩形倒过来看,也就是一个n*4的矩形,也就是只有四列的矩形dp[i] 表示铺满前i行的方案数,对于第i行的4个方块,它只可能这几种情况中一种...原创 2018-07-22 22:35:09 · 298 阅读 · 0 评论 -
poj1351 Number of Locks(数位dp)
题意:某工厂生产一种锁,锁上面有n条槽,现要求生产出来的锁,满足下述条件:1. 槽深 一定是{1,2,3,4}中的某个值2. 至少存在 一对相邻的槽,两槽的深度差等于33. 至少存在 3种不同深度的槽。问:已知n,求有多少中排列组合方式满足上述条件样例:2:0 因为只有2个槽,不满足条件3;3:8 3个槽满足的方案有 : 142 、143、 241 、214 ...原创 2018-07-22 14:30:54 · 222 阅读 · 0 评论 -
poj1321 棋盘问题(状态压缩)
题目: http://poj.org/problem?id=1321题目 :给定一个棋盘n*n,要求放m颗棋子上去,要求 每一行每一列只能有一个棋子,问有多少中放置方法?解题:状态:dp[i][j][k]; 表示 前i行,状态为j,容纳人数为k的情况数边界:dp[1][0][0] = 1 ; dp[1][第一行的每一个状态...][1] = 1;转移:因为n最大是8,数据较小,所以...原创 2018-07-21 22:12:27 · 344 阅读 · 0 评论 -
hdu3681 Prison Break (bfs + 二分 + 状态压缩)
题目: http://acm.hdu.edu.cn/showproblem.php?pid=3681题意:一个机器人要越狱,输入一个字符矩阵,'F'代表出发点,机器人从这个点出发,电池的电量是满的;'S'是空地,机器人可以走;'G'表示充电站,经过充电站,机器人可以选择给自己的电池充满电,充完电之后,该充电站就等同于'S‘,下次经过不再充电,机器人也可以选择只经过,不充电,那么它还是‘G’ ;...原创 2018-07-21 16:35:16 · 281 阅读 · 0 评论 -
zoj3471 Most Powerful(状态压缩)
题目 : http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3471题意:有n个原子,题目输入一个矩阵map[n][n],map[i][j]表示用原子i和原子j碰撞所产生的能量,原子i 撞击 原子j 后 原子j 消失。问这n个原子碰撞后 能产生的最大能量是多少?思路:状态dp[s] 表示到达状态s产生的最大能量,已...原创 2018-07-17 17:46:10 · 169 阅读 · 0 评论 -
poj2288 Islands and Bridges(状态压缩)
给出一个图,每个结点都有一个正权值,某些点之间有边相连,找总值最大的哈密顿回路,输出最大总值,和路径数量,如果不存在该回路,输出'0 0'总值计算方式:对于路径c1c2...cn,总值 由三部分组成:Part1 -- v1+v2+....+vnPart2 -- v[1]*v[2]+v[2]*v[3] +...v[n-1]*v[n]Part3 -- 判断如果路径中ci 和 ci...原创 2018-07-17 16:29:38 · 162 阅读 · 0 评论 -
poj1952 BUY LOW, BUY LOWER(最长递减子序列及个数)
原题: http://poj.org/problem?id=1952就是求最长递减子序列dp ,以及求不同的子序列的个数r ...思路和代码较长,请大牛见怪莫怪...想法:我们需要在求最长递减子序列的过程中加一些额外的步骤,顺便把不同的子序列数目也算出来....明白下面两点其实就差不多了...详细过程看不看都行..首先要明白:1. 对于相同的两个数ai,aj,ai在aj之前,一定有原创 2017-09-06 17:51:04 · 287 阅读 · 0 评论 -
hdu1069 Monkey and Banana
原题: http://acm.hdu.edu.cn/showproblem.php?pid=1069//每种方块不同的摆放方式 可以衍生出 9 种不同的方块//因为要求上面的那块x,y要小于下面那块的x,y //所以先按长x从大到小排序,对y求上升子序列中,求其中累积z的和最大的 #include#includeusing namespace std;struct原创 2018-05-17 12:41:51 · 166 阅读 · 0 评论 -
nyoj 456 邮票分你一半
#include#includeusing namespace std;int max(int a,int b){ return a>b?a:b;}int main(){ int i,j,n,t; int p[1010]; scanf("%d",&t); while(t--) { int dp[100001]={0}; int sum=0; scanf("%d原创 2017-03-30 21:31:30 · 327 阅读 · 0 评论 -
hdu 1114 Piggy-Bank
#include#include#include#includeusing namespace std;int min(int a,int b){ return a<b?a:b;}int main(){ int t; int i,j; scanf("%d",&t); while(t--) { int m,sum; scanf("%d %d",&m,&sum);原创 2017-03-30 20:54:07 · 192 阅读 · 0 评论 -
nyoj 49 开心的小明
#include#include#include#includeusing namespace std;int max(int a,int b){ return a>b?a:b;}int main(){ int t; scanf("%d",&t); while(t--) { int sum,m; scanf("%d %d",&sum,&m); int w[3原创 2017-03-30 20:01:30 · 301 阅读 · 0 评论 -
nyoj 37 回文字符串
#include#include#include#includeusing namespace std;int disc[1010][1010]={0};int max(int a,int b){ return a>b?a:b;}int main(){ int t; int i,j; char str1[1001]; char str2[1001]; scanf("原创 2017-03-30 00:52:17 · 190 阅读 · 0 评论 -
nyoj36 最长公共子序列
#include#include#includeusing namespace std;int disc[1010][1010]={0};int max(int a,int b){ return a>b?a:b;}int main(){ int t; int i,j; char str1[1001]; char str2[1001]; scanf("%d",&t);原创 2017-03-30 00:35:40 · 239 阅读 · 0 评论 -
nyoj17 单调递增最长子序列
#include#include#includeusing namespace std;int main(){ int t; char str[10001]; int M; int i,j; scanf("%d",&t); while(t--) { scanf("%s",str); int pos[10001]={1}; i=M=1; while(i<st原创 2017-03-30 00:00:59 · 235 阅读 · 0 评论 -
背包的二进制优化
原文: http://blog.csdn.net/qq_33171970/article/details/50582671关于二进制优化这一点,它为什么正确,为什么合理,凭什么可以这样分,至少我是花了很久很久才理解的,先拿一道题来说吧。HDU 2844 Coins题目链接:http://acm.hdu.edu.cn/showproblem.PHP?pid=2844题目:转载 2017-08-28 09:51:31 · 243 阅读 · 0 评论 -
poj2063 Investment(完全背包)
原题: http://poj.org/problem?id=2063思路:因为bond的价格是1000的倍数,所以把总钱数和bond的价格压缩1000倍,再进行完全背包就可以了。//完全背包#include#includeint main(){ int t; const int bei=1000; scanf("%d",&t); while(t--) { int mo原创 2017-09-13 14:55:45 · 230 阅读 · 0 评论 -
poj1953 World Cup Noise
原题: http://poj.org/problem?id=1953//写几个数推一下就会发现是斐波那契数列#includetypedef long long ll;ll dp[46]={0,2,3};ll get(int n){ if(n==0){ return 0; } if(dp[n]!=0) { return dp[n]; }else{ dp[n]=原创 2018-05-17 12:40:02 · 369 阅读 · 0 评论 -
poj 1579 Function Run Fun
原题: http://poj.org/problem?id=1579//记忆化搜索 #includeint dp[22][22][22]={1};int w(int a,int b,int c){ if (a <= 0 || b <= 0 || c <= 0) { return 1; } if(a > 20 || b > 20 || c > 20)//控制在20以原创 2018-05-17 12:40:32 · 230 阅读 · 0 评论 -
poj1664 放苹果
原题: http://poj.org/problem?id=1664这题没想出来,总觉得像之前看过的整数划分,然后就去查了一下整数划分,再去做就过了。这题数据小可以用递归做,自己也没想出来递归方式,还是太渣了。百度上面很详细地讲了怎么用递归做整数划分,我也看了一下动态规划的算法,两个都学习学习,多学一点没坏处。经典算法:递归整数划分 https://baike.baidu.com原创 2017-09-04 18:21:04 · 198 阅读 · 0 评论 -
记忆化搜索
原文: http://www.cnblogs.com/fu11211129/p/4276213.html 感谢作者。一. 动态规划动态规划(dynamic programming),与“分治思想”有些相似,都是利用将问题分 为子问题,并通过合并子问题的解来获得整个问题的解。于“分治”的不同之处在 于,对于一个相同的子问题动态规划算法不会计算第二次,其实现原理是将每一个计算过的子问题转载 2017-08-21 16:52:20 · 518 阅读 · 0 评论 -
区间dp nyoj737 合并石头(一)
区间dp讲解,感谢作者:http://www.cnblogs.com/qq-star/p/4161143.html题目连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=737 石子合并(一)原创 2017-04-07 09:25:00 · 491 阅读 · 0 评论