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
213. House Robber II
这道题是之前那道House Robber 打家劫舍的拓展,现在房子排成了一个圆圈,则如果抢了第一家,就不能抢最后一家,因为首尾相连了,所以第一家和最后一家只能抢其中的一家,或者都不抢,那我们这里变通一下,如果我们把第一家和最后一家分别去掉,各算一遍能抢的最大值,然后比较两个值取其中较大的一个即为所求。那我们只需参考之前的House Robber 打家劫舍中的解题方法,然后调用两边取较大值
分别求取舍去第一家和最后一家的时候可以提出来用函数来分别renew vector<int> dp;
221. Maximal Square
从正方形的右下角开始dp。遍历matrix的时候是从1,1开始。初始化从第一行与第一列开始。用变量来记录最大边长,即dp方程。