动态规划
stevewongbuaa
这个作者很懒,什么都没留下…
展开
-
lintcode backpack 背包问题
问题描述lintcode笔记 通常这种动态规划的问题需要建一个表作为缓存,然后搞清楚每个元素的含义,以及元素之间的递推关系。在这里建立一个二维表buff,行号i代表第几件物品,列号j代表背包容量。以物品w=[2,3,5,7]和容量m=11为例。buff[i][j]的含义是考虑第i件物品,容量为j的时候,所能放下的最大容量。那么,递推关系应该是:buff[i][j] = max(buff[i-1原创 2016-07-25 15:48:32 · 596 阅读 · 0 评论 -
Backpack VI
问题描述http://www.lintcode.com/zh-cn/problem/backpack-vi/Given an integer array nums with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer原创 2016-08-06 10:14:02 · 960 阅读 · 0 评论 -
构造回文
问题描述http://www.nowcoder.com/test/question/28c1dc06bc9b4afd957b01acdf046e69?pid=1725829&tid=3977396笔记最长回文串,其实就是一个字符串和它的翻转的“最长公共子序列LCS”代码原创 2016-08-02 10:23:33 · 579 阅读 · 0 评论 -
lintcode decode-ways 解码方法
问题描述笔记设置代码原创 2016-07-27 10:12:22 · 674 阅读 · 0 评论 -
lintcode coins-in-a-line-ii 硬币排成线ii
问题描述笔记设置buff[i]为考虑第i个到最后一个硬币,先手的人能拿到的硬币最大价值和对手的硬币最大价值。sum[i]为第i个到最后一个硬币的总价值。那么,当前情况我可以拿1个或者2个。 1. 拿1个,我先得到values[i]的价值,对方就得到buff[i+1]的价值,我就再得到sum[i+1]-buff[i+1]的价值; 2. 拿2个,我先得到values[i]+values[i+1]的原创 2016-07-27 08:32:59 · 625 阅读 · 0 评论 -
lintcode coins-in-a-line 硬币排成线
问题描述笔记设置buff[i]为:有i个硬币的时候第一个玩家是赢还是输。如果buff[i-1]和buff[i-2]都是赢,那我一开始无论取1个还是2个,对方都可以赢。(我取完之后可以看做对方是先手)如果buff[i-1]是赢,buff[i-2]是输,那我一开始就取2个,对方剩下i-2个只能输。那就是我可以赢。如果buff[i-2]是赢,buff[i-1]是输,那我一开始就取1个,对方剩下i-1原创 2016-07-26 23:14:52 · 700 阅读 · 0 评论 -
lintcode binary-tree-maximum-path-sum 二叉树中的最大路径和
问题描述笔记设置buff[i]为:后序遍历时,以当前节点结束的最大路径和。竟然做出来,有点感动。代码/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int val) { * this原创 2016-07-26 22:51:17 · 609 阅读 · 0 评论 -
lintcode unique-paths-ii 不同的路径ii
问题描述lintcode笔记要加入障碍的判断。 初始化第一行和第一列的时候,如果遇到障碍,往后的buff都是0。 状态转移方程加入当前节点obstacleGrid[i][j]的判断,如果obstacleGrid[i][j] == 1则buff[i][j] = 0代码class Solution {public: /** * @param obstacleGrid: A lis原创 2016-07-26 22:10:24 · 273 阅读 · 0 评论 -
lintcode unique-paths 不同的路径
问题描述lintcode笔记设置buff[i][j]为到i,j有多少条不同的路径,则状态转移方程为buff[i][j] = buff[i-1][j] + buff[i][j-1]初始化:buff[i][0] = 1;buff[0][j] = 1;代码class Solution {public: /** * @param n, m: positive integer (1 <原创 2016-07-26 21:50:45 · 264 阅读 · 0 评论 -
floyd算法
参考文章坐在马桶上看算法:只有五行的Floyd最短路算法引文 整个算法过程虽然说起来很麻烦,但是代码实现却非常简单,核心代码只有五行:for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i][j]>e[i][k]+e[k][j])转载 2016-07-26 18:41:29 · 160 阅读 · 0 评论 -
lintcode triangle 数字三角形
问题描述lintcode笔记代码1设置buff[i][j]为:以元素(i,j)结尾的最小路径和。 buff[i][j]应该是buff[i-1][j-1]和buff[i-1][j]中的较小值再加上当前的triangle[i][j]。 则状态转移方程为: buff[i][j] = min(buff[i-1][j-1], buff[i-1][j] + triangle[i][j] 初始条件为:原创 2016-07-26 17:19:59 · 1821 阅读 · 0 评论 -
lintcode paint-fence 栅栏染色
问题描述lintcodelintcode表述有问题,原文是“必须保证任意两个相邻的柱子颜色不同,应该表述为“不能有连续三个柱子颜色相同”。参考LintCode:栅栏染色 参考里改掉的表述感觉也不对,还是应该说“不能有连续三个柱子颜色相同”。笔记在改掉问题表述的情况下: 假设buff[i]为有i个柱子时的染色方案。可以分为两种情况: 1. 最后两个柱子颜色相同。 前i-2个柱子已经有buf原创 2016-07-26 16:31:32 · 1997 阅读 · 0 评论 -
lintcode minimum-path-sum 最小路径和
问题描述lintcode笔记代码原创 2016-07-26 15:35:57 · 368 阅读 · 0 评论 -
lintcode longest-increasing-continuous-subsequence 最长上升连续子序列
问题描述lintcode笔记假设buff[i]的含义是,从第0到第i个数的序列中,以第i个数为结尾的LICS的长度。(代码1) 九章算法的解法是,分别计算递增和递减的LICS长度,最后取大者,比我的解法简单。(代码2)代码1class Solution {public: /** * @param A an array of Integer * @return an原创 2016-07-26 14:39:24 · 643 阅读 · 0 评论 -
lintcode climbing-stairs 爬楼梯 递归 循环
问题描述lintcode笔记爬n级楼梯的方法数,等于爬上n-1级楼梯的方法数(再爬1级),加上爬上n-2级楼梯的方法数(再爬2级)。climbStairs(n) = climbStairs(n-1) + climbStairs(n-2)但是这样算会有大量的重复计算。可以将中间结果缓存起来。(代码2)也可以根据这个递推式自底向上地计算。先算climbStairs(1),climbStairs(2)。。原创 2016-07-26 14:38:03 · 978 阅读 · 0 评论 -
lintcode interleaving-string 交叉字符串
问题描述lintcode笔记buff[i][j]表示: s1的前i个字符和s2的前j个字符是否能交叉组成s3前i+j个字符。 若要buff[i][j] = true,有两种情况。s1前i-1个字符与s2前j个字符符合要求,而且s1的i个字符正好是s3的第(i+j)个字符。s2前j-1个字符与s1前i个字符符合要求,而且s2的j个字符正好是s3的第(i+j)个字符。还要做初始化。见代码2的再原创 2016-07-26 11:24:05 · 414 阅读 · 0 评论 -
lintcode longest-common-subsequence 最长公共子序列 证明
问题描述lintcode参考coursera-北京大学-算法基础-动态规划(1)-几个例题笔记动态规划问题,同样要建表。 buff[i][j]表示以字符串A的第i位结束,以字符串B的第j位结束,的最长公共子序列。 状态转移方程:if (A[i] == B[j]) buff[i][j] = buff[i-1][j-1] + 1;else buff[i][j] = max(b原创 2016-07-26 09:12:33 · 1517 阅读 · 1 评论 -
lintcode minimum-adjustment-cost 最小调整代价
问题描述lintcode笔记假设buff[i][j]的含义为:将第i个数改成j的调整代价。如果改成j之后不符合调整的目标则buff[i][j]=INT_MAX。初始化缓存将第0个数改为j的代价是buff[0][j] = abs(A[0]-j);为了符合调整目标,将第i个数改成j的话,第i-1个数k的可取值范围是[j-target, j+target]。在符合调整目标的情况下的状态转移方程为:buff原创 2016-07-25 23:18:37 · 963 阅读 · 0 评论 -
可绝对贪婪问题 数字去掉几位求最小值
参考《算法设计与分析》问题描述输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原来左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。输出应该包括所去掉的数字的位置和组成的新的正整数(N不超过240位)。数据结构设计:高精度正整数的运算应存储为字符串格式。问题分析在位数固定的前提下,让高位的数字尽量小,其值就较小。依据此贪婪策略就可以解决这个问题。原创 2016-08-30 22:46:28 · 1706 阅读 · 0 评论