动态规划自学积累
GMFTBY
for all
展开
-
动态规划入门题
求出凑够value的1,3,5供多少枚硬币,当然是最小值思路:(动态规划) 首先:动态规划和分治法的一个区别就是,分治法把问题分成独立的子问题,子问题之间独立性很强,最后将子问题的解合并 动态规划解决最优化问题,往往将问题的规模缩小之后,会发现子问题之间的练习是非常的密切,我们这时候就要注意列表记录历史中上次的求出原创 2016-05-12 16:56:13 · 601 阅读 · 1 评论 -
NYOJ18-动态规划水
Question:经典的数塔问题,我们经典的额dp求解思路Solution1:从上往下定义状态:DP[I][j]在第i层的第j位置处,我们的路径上的最优的价值状态转移方程:DP[i][j]=max(DP[i-1][j],DP[i-1][j-1])+map[i][j]Code1:#include"iostream"#include"cstdio"#include"原创 2016-09-11 22:30:57 · 365 阅读 · 0 评论 -
NYOJ214-LIS优化
Question:标准的LIS问题,最长公共子序列求最长的子序列的长度Solution:本题考得不是我们朴素的O(n*2)的动态规划的思路,本题考查的是LIS的O(n*lgn)的优化思路在大数据10 0000的数据量下,朴素的动态规划明显超时Code1:#include"iostream"#include"cstdio"#include"cstring"#de原创 2016-09-12 10:06:17 · 497 阅读 · 0 评论 -
NYOJ995-经典DP
Question:输入:n,v分别代表硬币系统中的面值的种类数目和要凑的零钱的总数之后n个数字代表硬币系统输出:如果可以通过该硬币系统找零,请求出最少需要的硬币个数,否则输出最好的情况下,我们还剩下多少的硬币没有找(最小值)Solution:经典的动态规划思想定义状态:DP[i]代表找i零钱需要的最少的硬币的个数,如果不能找的话,DP[i]就是-1原创 2016-09-12 13:11:43 · 474 阅读 · 0 评论 -
LCS问题求解-动态规划
1.何为LCS问题:在求解LCS问题之前,我们需要先了解一下什么叫做最长公共子序列最长公共子序列:用我们最容易通俗理解的话语来解释的话,最长公共子序列就是两个或者多个串中,最长的相同的子序列ps:子序列可以不连续,但是有先后的次序关系LCS问题应用非常的广泛2.如何求解LCS问题:1.暴力搜索LCS问题如果我们只仅限于两个的=字符串的话,我们的首先的思考的策略是原创 2016-09-15 00:11:54 · 6979 阅读 · 2 评论 -
NYOJ 44 & 104 - 最大连续子串和(矩阵最大子矩阵和)
1.NYOJ44-最大连续子串和两种解法:1.归并:(运行时间比DP长O(n*lgn),但是耗用内存小,好吧,其实dp不用开很大内存,O(1)的dp也可以解决,总体来说,dp更好一些)无非三种情况,最大连续子串在mid左边,最大连续子串在mid右边,最大连续子串横跨左边和右边递归调用即可Code:#include"iostream"#include"cstdio"原创 2016-09-15 14:39:45 · 402 阅读 · 0 评论 -
NYOJ983-首尾相连的最大子数组和(升级版子数组和)
Question:本体是最大子数组和的升级版,我们这里允许数组首尾相接,那么这里面就会涉及到更多地知识点Solution:首先,我们定义的状态和状态转移方程不变定义状态:dp[i]:以第i位作为结尾的最大子数组和(连续的子数组)状态转移方程:if dp[i-1]else dp[i]=dp[i-1]+data[i]在本题中我们加入了一些处理的技巧,首先,既原创 2016-09-16 14:07:17 · 358 阅读 · 0 评论 -
HDU4508-完全背包
Question:标准的完全背包水题Code:#include"iostream"#include"cstdio"#include"cstdlib"#include"cstring"#define N 105 using namespace std;int n;int v;int weight[N];int value[N];int dp[100005];i原创 2016-09-17 09:18:53 · 305 阅读 · 0 评论 -
背包九讲01-01背包问题阅读笔记
1.问题描述:背包问题:给出n件物品以及我们的背包的总容量v,以及n件物品的价值value和耗费cost,每件物品只有两种选择,装或者不装,请问如何选择装填的物品才可以使我们的最后获得价值最大2.求解思路:这我就不阐明记忆化搜索的思路了,既然是背包问题的专题,我就只讲动态规划的方法定义状态:dp[i][j]:在容量为j的时候我们选择前i件物品可以获得的最大的价值状态转移原创 2016-09-17 10:21:45 · 497 阅读 · 0 评论 -
背包问题九讲02-完全背包问题总结
1.题目描述:假设有n件物品,每件物品都有value,和cost属性,现有一个容量为v的背包,现在每件物品都有无限件可以选择,请问为了使背包的总价值最大,我们该怎么挑选放入背包的物品,输出我们的最大总价值2.思路:Benin属于彪悍尊的额完全背包问题,和01背包问题有所不同,完全背包问题强调了,每种物品都有无限件可以选取,那么我们最终要检查的状态就不在是01背包问题中的O(V*N)而是原创 2016-09-18 09:36:20 · 1269 阅读 · 1 评论 -
NYOJ252-动态规划水
Question:给出定义01串,01串中不存在11这种子串,求长度为n的01串中满足定义的要求的01串的个数是多少Solution:思考之后,发现其实是标准的斐波那契数列首先定义状态:DP[i]:长度为i的01串中满足条件的01串的个数是多少状态转移方程:DP[i]=DP[i-1]+DP[i-2]这么理解:1.当前的第i位是1的时候,为原创 2016-09-11 21:50:35 · 395 阅读 · 0 评论 -
HDU2602-01背包基础
Question:输入:首先输入测试用例的个数其次一次输入物品的个数N和背包容量V随后输入的n个数代表每个物品价值最后的输入的n个数代表每个物品的体积要求输出背包最多可以携带多大价值的物品Solution1:01背包的思想:定义状态:DP[i][j]:代表在背包的容量为j的情况下,在取第i个物品的时候,我们最大可以携带的物品的总价值状原创 2016-09-11 20:53:24 · 307 阅读 · 0 评论 -
急求大神帮忙解决的问题
上一篇的动态规划入门题我引申了几个问题不会解决求大神帮忙1:如何判断对于给定的硬币的种类对某个特定的值不存在任何一个可以满足的情况2:如何将所有可能的凑出来的情况都进行保存原创 2016-05-12 17:06:28 · 543 阅读 · 0 评论 -
动态规划初级题解
1.在这里我们先首先声明一下什么是最大上升子序列,因为在自学过程中被莫名奇妙的坑了一下5,3,4,8,6,7在这里最大上升子序列是3 4 6 7而不是3 4 8,3 4 8称作最大连续上升子序列(一会我们也用动态规划来解决一下)2.开始算法分析 1)暴力搜索:想想都觉得很麻烦 2)动态规划算法:我们将原问题进行拆解,拆解成性质一样但是规模缩小的子问题来看,首先用dp数组来记原创 2016-05-13 09:14:13 · 320 阅读 · 0 评论 -
动态规划中级题解
二维的动态规划解决题目:假设在一个N*M的平面上,有N*M个格子,每个格子中都有一定数量的苹果,每次我们只能从某个格子处向右或者向下走,注意不能超过地图的限制,请问如何设计路径才可以保证最后从起点到终点后获得的苹果数量最多动态规划解析:建立二维的dp数组dp[i][j]表示走到map[i][j]格的时候能够获得的最多的苹果数目最后将问题进行分解,不断缩小规模,直到dp[startx][原创 2016-05-13 12:59:40 · 377 阅读 · 0 评论 -
动态规划 中级题解 路径记录
对于上一篇的记录路径的问题,达神教我可以再开一个二维数组进行路径记录,最后用栈进行输出格式调整首先再码一遍那个收集苹果的二维动态规划问题#include"iostream"#include"cstdio"#include"cstdlib" using namespace std;struct node{int x,y;};typedef st原创 2016-05-13 18:06:51 · 946 阅读 · 0 评论 -
阶梯问题 动态规划浅析
有一个台阶,我们每次只能一次上一个或者一次上两个台阶,请问到第n个台阶有几种走法动态规划:首先我们将问题规模进行缩小,直到最后两节台阶,第一节台阶只有一种走法,第二节台阶有两种走法每一节台阶可以看做有前一个台阶走一步到的,和前两个台阶走两步到的,所以是前面两者的和所以:状态转移方程也就很好描述了dp数组记录到第i阶台阶可以的方法下面附上代码及解析#include"ios原创 2016-05-14 10:21:58 · 1510 阅读 · 1 评论 -
最大子数组 两个经典解法(动态规划,分治法)
最大子数组:数组中子序列和最大的子数组的和求解1.分治法:将问题的分割分成三部分进行考虑leftsum,rightsum和crosssum进行综合考虑分治法代码:#include"iostream"#include"cstdio"using namespace std;int a[] = {0, 13, -3, -25, 20, -3, -16, -23, 18, 20, -原创 2016-05-14 11:35:36 · 409 阅读 · 0 评论 -
比赛总结
求解出从左上角到右下角的所有的路径的个数该题明显的是动态规划的求解思路首先:定义状态:dp[i][j]代表走到地图的i,j处的路径总数状态转移方程:根据定义来看,dp[i][j]=dp[i-1][j]+dp[i][j-1]这个状态转移方程是核心:含义是要走到map[i][j]的路径数等于走到map[i][j-1]处再走一步加上走到map[i-1][j]再走一步i原创 2016-08-18 22:40:05 · 530 阅读 · 0 评论 -
微软面试百题003(归并排序/动态规划)
微软面试百题003 求子数组最大和原创 2016-08-08 13:17:34 · 1330 阅读 · 0 评论 -
POJ 2586 - 贪心 or DP
1.Question:有一个公司,12个月份,所有的连续的5个月都是亏损的,请求出在此情况下的一年最大的盈利数目,如果没有输出Defict输入:n,d分别代表每个月的固定的收入和固定的亏损2.Solution:相比较而言,DP的思路更快:DP 0ms 贪心16ms本题我用了两种思路去做:1.贪心:网上的大神的讲解:我们从1月开始贪心,每次将亏损的月份放在最后面才原创 2016-10-28 09:21:16 · 383 阅读 · 0 评论