随笔分类 - 动态规划
摘要:一:解题思路 这道题和leetcode518 比较类似。将状态稍微修改一下,d(i,j)表示使用前i种面值的硬币(即面值数组中0~i-1的元素),凑成数值j需要的最少硬币数量。 Time:O(n*sum),Space;O(n*sum),其中n为面值数组的长度。 二:完整代码示例 (C、C++、Jav
阅读全文
摘要:一:解题思路 运用动态规划的思想去解题。定义状态d(i,j)表示使用前i种面值的硬币(即面值数组中0~i-1的元素),凑成数值j的组合数量。 初始条件:d(0,j)=0,d(i,0)=1 状态转移方程:d(i,j)=d(i-1,j)+d(i,j-c[i-1]),其中,j-c[i-1]>=0,d表示二
阅读全文
摘要:一:解题思路 方法一:动态规划的方法。定义d(i,j)为坐标(i,j)的最小路径和。状态转移方程为:d(i,j)=min(d(i-1,j-1),d(i-1,j))+a(i,j) d(0,0)=a(0,0),d(i,0)=d(i-1,0)+a(i,0),d(i,i)=d(i-1,i-1)+a(i,i)
阅读全文
摘要:一:解题思路 这是一道动态规划的难题,即一个规模较大的问题可以分解为一个个规模较小的问题,并且规模较小的问题和规模较大的问题解法是一样的。 Time:O(m*n),Space:O(m*n) 二:完整代码示例 (C++版和Java版) C++: class Solution { private: in
阅读全文
摘要:一:解题思路 方法一:用动态规划的思想来做。Time:O(n^2),Space:O(n) 方法二:采用二分搜索的思想来做。Time:O(n*log(n)),Space:O(n) 二:完整代码示例 (C++版和Java版) 方法一C++: class Solution { public: int le
阅读全文
摘要:一:解题思路 之前做过一道题目,求连续子序列的最大和。Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { private: int max3(int a, int b, int c) { return max(max(a,
阅读全文
摘要:一:解题思路 这是一道经典的动态规划的题目。 方法一:定义初始转态和转态转移方程。 d[0][0]=a[0][0];对于一行:d[0][j]=d[0][j-1]+a[0][j]; 对于第一列:d[i][0]=d[i-1][0]+a[i][0]; 除了第一行和第一列之外的其他元素:d[i][j]=mi
阅读全文
摘要:一:解题思路 这个题目有2种解法。第一种为暴力破解法,求出所有可能的情况,然后得到最大值。Time:O(n^2)。Space:O(1) 第二种方法,采用动态规划的思想。Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) 第一种方法C++: class Solutio
阅读全文
摘要:一:解题思路 这道题目是一道简单的动态规划题目。 第一种方法为递归法。Time:O(2^n),Space:O(n) 第二种方法利用一个数组:Time:O(n),Space:O(n) 第三种方法为迭代法。Time:O(n),Space:O(1) 二:完整代码示例 (C、C++、Java、Python)
阅读全文
摘要:一:解题思路 这道题用动态规划的思想来做,可以将时间复杂度降低为Time:O(n),空间复杂度为:O(1) 二:完整代码示例 (C++版和Java版) C++版: class Solution { public: int max(int a, int b) { return a>b?a:b; } i
阅读全文

浙公网安备 33010602011771号