
动态规划
文章平均质量分 71
记忆星空
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
poj1952
又是一道最长上升子序列的变形,让你求最长下降子序列的长度和个数,长度很简单,统计个数关键是不能重复,什么叫做重复呢,就是你找出来的所有情况,不可以存在2种序列完全一模一样,比如3 2 1 3 2 1这个问题答案 3 1,因为第一个 虽然有2个3 2 1出现,但是他们是重复的,只能算是一种。首先一个问题,假如现在不考虑重复,怎么求最长下降子序列的个数。对于这个问题,我首先想起来以前做过的一道关于最短原创 2014-12-29 11:37:36 · 1082 阅读 · 0 评论 -
LeetCode Largest Rectangle in Histogram&&Maximal Rectangle
第一题就是让你在一个直方图里面求一个面积最大的矩阵,觉得O(n*n)的方法应该是非常显然了,枚举一个长方形,分别往前往后找到它的界,也就是第一个比这个长方形高度小的位置,然后两个界之差乘以这个长方形的高度就是结果,然后枚举所有长方形求最大值即可。这样的复杂度应该是过不了的,这题枚举长方形确实已经不能再优化了,但是找界的方法,可以用一个叫单调队列的东西在O(1)的时间找到。 我曾经做过这么一道题,原创 2015-04-10 12:33:49 · 533 阅读 · 0 评论 -
LeetCode Longest Valid Parentheses
觉得本题是我见过为数不多的O(N)复杂度的dp,当然思想也比较巧妙,不过这题不是我自己想出来的,由于这个括号匹配问题和卡特兰数有关,所以我的dp方程就是往二维的去想了,但是这题就是超时。 dp[i]表示以第i个字符为结尾的最长合法串,首先如果这个字符是左括号,那么有dp[i]=0, 否则计算dp[i]可能需要dp[i-1]的值,就是dp[i-1]表示以第i-1个字符为结尾的最长合法串,那么在这原创 2015-01-28 20:02:21 · 436 阅读 · 0 评论 -
LeetCode Palindrome Partitioning I&&Palindrome Partitioning II
一看到这个问题马上有一个类似矩阵连乘dp的思想,dp[i][j]表示第i个字符到第j个字符可以分的最少回文串数,那么有dp[i][j]=min(dp[i][k],dp[k+1][j]),k=[i,j-1],如果i到j不是回文;dp[i][j]=1,i到j是回文。用这样的方法首先要用数据isdc[i][j]来记录i位置到j位置的串是不是回文,计算这样的dp数组需要的时间复杂度是O(n^3),交上去超原创 2015-01-16 19:59:22 · 506 阅读 · 0 评论 -
LeetCode Best Time to Buy and Sell Stock III && Best Time to Buy and Sell Stock IV
LeetCode这个买股票题,个人认为是出的比较好的,一共四个问题,其中3和4都是hard,在我看来,4的难度比3还是难了不少,因为他涉及到了dp的优化 这里就稍微再提一下第一问和第二问,第一问已经有了一个dp的思想,答案是max(prices[i]-min(prices[j]))其中,j从0取到i-1,乍一看需要O(n*n)的复杂度,但是通过用一个数保存前i个price中最小的那个price就原创 2015-03-13 10:57:28 · 509 阅读 · 0 评论 -
关于几个数
说这些数和公式之前,我想先说下一个非常重要的问题,也就是子问题,所谓子问题,无非就是问题实质和原问题一样,而规模小了一点而已,可能小了1,也可能小了一半,解决一个问题往往要解决它的子问题,然后通过子问题的值推到出原问题的答案,这也是动态规划的精髓之一。 1错排: 有n个人编号1到n,本来都站在各自的位置上,现在让他们站一排,每个人不能站在原来的位置上去,问有都少种排列方法? 现在我觉得我高中原创 2014-02-13 10:58:07 · 879 阅读 · 3 评论 -
pat1068
给你n个数和一个给点的m,问你这n个数中能否有某些数的和等于m,如果有,输出字典序最小的那个解。 本题算是一个背包吧,假如不要求输出解,完全可以一维的状态,只要注意下后推和前推,一开始确实被这个坑了,用一维的话,输出的方案会有重复使用某个数的情况,后来改成二维,二维就不存在前推后推的区别了,学背包问题,如果不懂一维二维前推后推的区别,那只能说连皮毛也没学到。 dp[i][j]表示前i个数中能否原创 2013-10-25 19:18:55 · 1178 阅读 · 0 评论 -
九度1500
题目意思很简单,算是一个最长公共子序列的加强版把,可以这么认为把。如果让你排成单调向上的一排,相信大家都会做,那么如果是山峰那样的,其实我也需要从前往后,从后往前做一下最长上升自序列,然后枚举每一个点作为最高点,取一个最优的即可,n比较大的时候需要nlogn算法,一般是二分,前几天看到也可以用树状数组做。 附1500代码如下 #include #include int a[1000001]原创 2013-10-20 12:17:32 · 612 阅读 · 0 评论 -
九度1544
刚学的st算法,顺便看到了lg取下届的数组实现方式,以前没用过lg这东西,这里存下,关于st算法,本质是动态规 划,个人dp认为主要注意的是三点,1初始值,2边界,3递推顺序,方程是这样的: 最大值 dp[i,j]=max(f[i,j-1],f[i+2^(j-1),j-1]); 最小值 dp[i,j]=min(f[i,j-1],f[i+2^(j-1),j-1]); 且dp[i,0]其实就等原创 2013-10-12 18:55:42 · 634 阅读 · 0 评论 -
九度1499
这题与很久以前做过一个贪心题类似,给你n个任务,每个任务都有起始时间和结束时间,而且每个任务还有一个价值,不可以在同一时间同时做两个任务,也就是说不能一个任务没做完去做下一个任务,说白了就是给你一段区间,然后几个线段让你去放到区间上,区间和区间不能有重叠(边界有交集可以),每个区间有个价值,问你怎么放才能取得最大的价值。 我之前做的是价值为1的,或者说是问你最多可以安排多少个任务,这道题每个区间原创 2014-12-13 21:10:04 · 412 阅读 · 0 评论 -
九度1502
九度1502这题我觉得我还是比较奇葩的,看到这种最值这种想到的就是动态规划,弄出了dp方程居然过了2组数据,后来发现,这题貌似没有最优子结构性质。后来看到别人是二分做的,二分的是答案,好吧,总觉得二分答案的想法很奇特,是不是没啥想法了就试试二分答案呢,然后宁波理工蔡老师地方拿来final队员的二分写法,果然比市面上流传的2种更好理解点。受教了。 说了一大堆,本题的思路就是,二分一个答案,看看是否原创 2013-11-03 18:04:06 · 929 阅读 · 0 评论 -
hdu1069
本题是一个最长上升子序列的变形,题目给你n种长方体,每种都是无数个,然后让你堆出最大的高度,如果长方体A能放在长方体B上面,那么必须满足长方体A的底面长宽分别都是严格小于长方体B的,根据这一点,给定一块长方体,按照不同的放法,可以生成6个长方体,注意不是3块。另外比较重要的一点就是,这个问题dp前必须要排序,假设长方体的长宽高设为x,y,z,因为前面已经扩展出6个长方体,我就把z当做高,把x,y当原创 2014-12-19 00:07:53 · 535 阅读 · 0 评论 -
LeetCode Dungeon Game
起初我是这样定义dp的。dp[i][j]表示从(0,0)到(i,j)需要的最少血量,那么有, dp[i][j]=min(dp[i-1][j],dp[i][j-1])-dungeon[i][j]; 大家可以想想这个方程对吗? 给这么一组数据 -3,2 那么我走到-3需要hp=4,那么走到2需要hp反而变少了,变成了2?试问我用hp等于2出发,连-3都过不了! 所以这样的方程明显错误。 换原创 2015-01-28 21:20:46 · 637 阅读 · 0 评论