Dynamic Programming - leetcode [动态规划]

时间:2023-03-09 19:57:06
Dynamic Programming - leetcode [动态规划]

115. Distinct Subsequences

96. Unique Binary Search Trees

120. Triangle

123. Best Time to Buy and Sell Stock III

最后用了两遍扫描:从前往后, 从后往前。注意初始赋值。

132. Palindrome Partitioning II

return minmimun cut

int dp[n + 1];
dp[0] = -1;
bool isPalin[n][n];//index 从x到y是palin

注意:isPalin初始化的时候!三种情况!:1只是单独字母 true;2相邻是(s[i] == s[i+1]);3相隔一个 i从后往前 j从i+2 往后到n-1

135. Candy

注意:还要从后往前刷一遍 验证 因为要跟两边的neighbors相比
139. Word Break

一维DP 带两个变量i,j的问题

for(vector<string>::iterator iter = wordDict.begin(); iter != wordDict.end(); iter++)

实现时前面加一个dummy节点,这样可以把三种情况统一到一个表达式里面。

一个DP问题。定义possible[i] 为S字符串上[0,i]的子串是否可以被segmented by dictionary.

那么

possible[i] = true      if  S[0,i]在dictionary里面

= true      if   possible[k] == true 并且 S[k+1,j]在dictionary里面, 0<k<i

= false      if    no such k exist.

174. Dungeon Game

从后往前遍历!!!

用一个二维数组ans[][]表示到每个格子时,勇士到每一步时至少需要的魔力,如ans[i][j]表示勇士在[i, j]处至少需要ans[i][j]魔力才能到达[m, n]救出皇后。
技巧:从[m, n]往回遍历到[1, 1]

188. Best Time to Buy and Sell Stock IV

用两个地推公式来分别更新两个变量local和global。

local[i][j]:在到达第i天时最多可以进行j次交易并且在最后一次交易在最后一天卖出的最大利润。局部最优。

global[i][j]: 在到达第i天最多可进行j次交易的最大利润。全局最优。

local[i][j] = max(global[i - 1][j - 1] + max(diff, 0), local[i - 1][j] + diff);

global[i][j] = max(local[i][j], global[i - 1][j])

但这道题还有个坑,就是如果k的值远大于prices的天数,比如k是好几百万,而prices的天数就为若干天的话,上面的DP解法就非常的没有效率,应该直接用Best Time to Buy and Sell Stock II 买股票的最佳时间之二的方法来求解

198. House Robber