贵阳自助建站软件,易托管建站工具,好看的官网源码,wordpress 不用模版目录
讀題
647. 回文子串
看完代码随想录之后的想法
516.最长回文子序列
看完代码随想录之后的想法
647. 回文子串 - 實作
思路
動態規劃思路
雙指針思路
Code
動態規劃思路
雙指針思路
516.最长回文子序列 - 實作
思路
Code
动态规划 - 總結
動態規劃基礎
動…目录
讀題
647. 回文子串
看完代码随想录之后的想法
516.最长回文子序列
看完代码随想录之后的想法
647. 回文子串 - 實作
思路
動態規劃思路
雙指針思路
Code
動態規劃思路
雙指針思路
516.最长回文子序列 - 實作
思路
Code
动态规划 - 總結
動態規劃基礎
動態規劃五部曲
誤區
動態規劃與貪心算法的差別
靈魂三問
基礎題目
背包問題
背包問題 - 遞推公式
遍歷順序差異
打家劫舍
股票問題
子序列問題
編輯距離問題
回文子串問題 讀題
647. 回文子串
看完代码随想录之后的想法
對於dp數組的定義又有了進一步的了解之前沒有想到可以使用ij這兩個下標來表示範圍理解過後使用上就比較知道怎做了並且後續也有談到如何使用雙指針法進行基本上就是利用回文子串的特性相對的位置上一定相同在這題上又加深了自己對於雙指針以及回文特性的操作。
516.最长回文子序列
看完代码随想录之后的想法
原本有想到應該是類似於647但自己只有想清楚了下標但沒有想清楚遞推公式看題解之前並沒有去思考說相等等於原本的回文子串2長度並且不相等時當時想過很多但後面看完之後才知道是去取兩段範圍內最長的部分在這個題目當中又複習到了之前的操作。 647. 回文子串 - 實作
思路
動態規劃思路
aside 根據字符串的性質決定dp數組的定義
/aside 定義DP數組以及下標的含意 dp[i][j]: [i, j]範圍內的字符串是否為回文子串 遞推公式 dp[i][j] s[i] s[j] 相等有三種狀況 兩者指向同一個元素範圍為0j - i 0; 兩者相差一個元素即相鄰範圍為1j - i 1; 兩者相差大於一個元素其實可以想成兩者範圍內的元素是否為回文子串如下圖 如果[i2, j-2] [i1][j-1]都是回文子串那當s[i]s[j]相等時一定也會是回文子串 |------|------|------|------|
i i1 i2 j-1 jj-2根據遞推公式、題意以及定義確定DP數組如何初始化 將dp數組都初始化為false確保每一次的狀態都是由自己推的 確定遍歷順序 可以看到dp[i][j]是由左下角的值推導出來的所以遍歷順序應該是由下到上由左到右。 ------------------------ | | dp[i][j] | ------------------------ |dp[i1][j-1]| | ------------------------
雙指針思路
aside 雙指針法由中間往外擴散出去進行遍歷
/aside 定義函數 來遍歷以ij為中心的數組往左右擴散並確認是否為回文字串 需要傳入的參數 ij左邊界以及字串 回傳以i、j為中心的的回文字串有多少個。 主函數 有兩種狀況i以及i與i1因為中心點有可能是一個數也有可能是兩個數 遍歷字符串所有位置 定義一個result變數紀錄回文字串的總數
Code
動態規劃思路
class Solution {
public:int countSubstrings(string s) {vectorvectorbool dp (s.size(), vectorbool(s.size(), false));int result 0;for(int i s.size() - 1; i 0; i--) {for(int j i; j s.size(); j) {if(s[i] s[j]) {if(j - i 1) {dp[i][j] true;result;} else if(dp[i 1][j - 1] true) {dp[i][j] true;result;}}}}return result;}
};雙指針思路
class Solution {
public:int countSubstrings(string s) {int result 0;for(int i 0; i s.size(); i) {result extend(s, i, i, s.size());result extend(s, i, i 1, s.size());}return result;}int extend(string s, int i, int j, int n) {int res 0;while(i 0 j n s[i] s[j]) {i--;j;res;}return res;}
};516.最长回文子序列 - 實作
思路
aside 根據字符串的性質決定dp數組的定義
/aside 定義DP數組以及下標的含意 dp[i][j]: [i, j]範圍內的字符串最長回文子串長度為dp[i][j] 遞推公式 相等: s[i] s[j] 相等代表說這兩個數值可以加入到回文子串最長的範圍內所以是dp[i 1][j - 1] 2代表上 |------|------|------|------|
i i1 i2 j-1 jj-2不相等: s[i] s[j] 不相等代表說這兩個數值無法到回文子串最長的範圍內所以我們要找出上一次i ~ j - 1 以及i 1 ~ j的這兩個範圍內誰有最長的回文子串。 所以是max(dp[i1][j], dp[i][j - 1]) 範圍內哪段回文子串最長。
|--------------------|
i j-1|--------------------|i1 j
|------|------|------|------|
i i1 i2 j-1 jj-2兩者指向同一個元素範圍為0j - i 0; 兩者相差一個元素即相鄰範圍為1j - i 1; 兩者相差大於一個元素其實可以想成兩者範圍內的元素是否為回文子串如下圖 如果[i2, j-2] [i1][j-1]都是回文子串那當s[i]s[j]相等時一定也會是回文子串 根據遞推公式、題意以及定義確定DP數組如何初始化 在i跟j 相同時可以知道最長回文子串的長度都是1而在遞推公式中是計算不到i、j相同的情況。 將dp數組都初始化為0並確保i、j相等的狀態都是1。 確定遍歷順序 可以看到dp[i][j]是由左下角的值推導出來的所以遍歷順序應該是由下到上由左到右。 ------------------------ | dp[i][j-1] | dp[i][j] | ------------------------ |dp[i1][j-1]| dp[i1][j] | ------------------------
Code
class Solution {
public:int longestPalindromeSubseq(string s) {vectorvectorint dp (s.size(), vectorint(s.size(), 0));for(int i 0; i s.size(); i) dp[i][i] 1;for(int i s.size() - 1; i 0; i--) {for(int j i 1; j s.size(); j) {if(s[i] s[j]) {dp[i][j] dp[i 1][j - 1] 2;} else {dp[i][j] max(dp[i 1][j], dp[i][j - 1]);}}}return dp[0][s.size() - 1];}
};动态规划 - 總結
動態規劃基礎
動態規劃五部曲 定義DP數組以及下標的含意 如果想不清楚dp数组的具体含义递归公式从何谈起甚至初始化的时候就写错了。 dp[i][j] i 代表甚麼意思j代表甚麼意思 dp[i] i 代表甚麼意思元素代表甚麼意思 遞推公式 根據遞推公式確定DP數組如何初始化 例如**动态规划不同路径还不够要有障碍 (opens new window)**在这道题目中初始化才是重头戏 確定遍歷順序 如果看过背包系列特别是完全背包那么两层for循环先后顺序绝对可以搞懵很多人反而递归公式是简单的。 打印dp數組 至于推导dp数组的重要性动规专题里几乎每篇Carl都反复强调当程序结果不对的时候一定要自己推导公式看看和程序打印的日志是否一样。
誤區
遞推公式不該是過於關注的點它只是解題的一部分別讓自己在解題時處於黑盒狀態
動態規劃與貪心算法的差別
動態規劃每一個狀態一定是由上一個狀態推導出來而貪心則是從局部選最優堆疊成全局最優
靈魂三問
这道题目我举例推导状态转移公式了么我打印dp数组的日志了么打印出来了dp数组和我想的一样么
基礎題目
动态规划斐波那契数(opens new window)动态规划爬楼梯(opens new window)动态规划使用最小花费爬楼梯(opens new window)动态规划不同路径(opens new window)动态规划不同路径还不够要有障碍(opens new window)动态规划整数拆分你要怎么拆(opens new window)动态规划不同的二叉搜索树
背包問題
背包問題 - 遞推公式 最多裝多少/能否裝滿 dp[j] max(dp[j], dp[j - nums[i]] nums[i]); → 可以想像成物品重量與價值相等 對應題目 动态规划416.分割等和子集(opens new window)动态规划1049.最后一块石头的重量 II 最大價值 dp[j] max(dp[j], dp[j - weight[i]] value[i]); → 可以想像成物品重量與價值不相等 對應題目 动态规划474.一和零 裝滿背包有多少方式 dp[j] dp[j - nums[i]]; 對應題目 动态规划494.目标和(opens new window)动态规划518. 零钱兑换 II(opens new window)动态规划377.组合总和Ⅳ(opens new window)动态规划70. 爬楼梯进阶版完全背包 最少裝多少/能否裝滿 dp[j] min(dp[j - coins[i]] 1, dp[j]) 對應題目 动态规划322.零钱兑换(opens new window)动态规划279.完全平方数
遍歷順序差異 01背包 二維dp 因為數值都會根據左上方以及正上方的值進行更新所以當我們初始化第一行與第一列時不管是從背包開始遞推還是物品開始遞推都可以。 第二層遍歷順序是由小到大 一維dp 在二维數組中每一層的數值都是當前位置的正上方以及左上方的數據得出 從二维壓縮成一维數組我們需要模擬二维數組的方式 所以根據我們的遞推公式我們不能使用正序遍歷不然原本在二维數組中左上方的數據就會被覆蓋掉 而使用倒序可以保證每一層的數據都是由二维數組上一層正上方以及左上方得出的。 二維dp 滾動dp 在**动态规划474.一和零 中是有兩個維度的背包** 先遍歷物品在遍歷二維背包 因為是滾動數組所以二維背包是由後往前遍歷 完全背包 在純完全背包的問題當中既然物品可以被選取無限次那麼考慮某個物品時不必限制只看一次。 換句話說可以在考慮這個物品的同時也考慮其他所有的物品。 因此不論先遍歷物品還是先遍歷容量結果都是一樣的。 如果求最小数那么两层for循环的先后顺序就无所谓了相关题目如下 求最小数动态规划322. 零钱兑换 (opens new window)、动态规划279.完全平方数但如果題目要求的回答是組合或者是排序就會有所差別 組合 - 不要求順序性: 外層遍歷物品內層遍歷背包 排列- 要求順序性: 外層遍歷背包內層遍歷物品 相關題目 求组合数动态规划518.零钱兑换II(opens new window)求排列数动态规划377. 组合总和 Ⅳ (opens new window)、动态规划70. 爬楼梯进阶版完全背包可以想像在求組合的時候外層遍歷物品確保每個背包至多只會有一次的組合 但在求排序時因為每個背包都會重新遍歷物品所以會有不同的順序被計算到
打家劫舍
對應問題 动态规划开始打家劫舍(opens new window)动态规划继续打家劫舍(opens new window)动态规划还要打家劫舍
股票問題 單一股票買賣一次求最大数值主要就是定義上持有股票的現金以及不持有的部分進行初步的劃分 动态规划121.买卖股票的最佳时机 透過遞規公式找出数組中的最大数值 dp[i][0] max(dp[i - 1][0], -prices[i]);
dp[i][1] max(dp[i - 1][1], dp[i - 1][0] prices[i]);單一股票買賣多次求最大数值主要就是定義上持有股票的現金以及不持有的部分進行初步的劃分 动态规划122.买卖股票的最佳时机II 在遞推公式上就是在買入的時機會出現差異變成是說上一次獲得的現金減去當下的股票金額哪個優 dp[i][0] max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
dp[i][1] max(dp[i - 1][1], dp[i - 1][0] prices[i]);單一股票只能買賣特定次数 动态规划123.买卖股票的最佳时机III 、 动态规划188.买卖股票的最佳时机IV 主要體現在下標上面就會有差異分為沒有操作、買入股票、賣出股票這三個部分 因為每次的買賣都一定是2 * k 次(買入、賣出)所以在的推公式上其實就是將買賣次数進行抽象化處理 for(int j 1; j 2 * k 1; j) {if(j % 2 1) dp[i][j] max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);else dp[i][j] max(dp[i - 1][j], dp[i - 1][j - 1] prices[i]);
}單一股票只能買賣包含冷凍期 动态规划309.最佳买卖股票时机含冷冻期 主要體現在定義上會有所差別需要將賣出的狀態分為保持賣出以及賣出這樣使得冷凍期的數值有所依歸 遞推公式如下 dp[i][0] max(dp[i - 1][0], max(dp[i - 1][3]- prices[i], dp[i - 1][1]- prices[i]));
dp[i][1] max(dp[i - 1][1], dp[i - 1][3]);
dp[i][2] dp[i - 1][0] prices[i];
dp[i][3] dp[i - 1][2];單一股票多次買賣包含手續費 动态规划714.买卖股票的最佳时机含手续费 主要體賣出時需要多加上一個手續費的計算 遞推公式如下 dp[i][0] max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
dp[i][1] max(dp[i - 1][1], dp[i - 1][0] prices[i] - fee);子序列問題
編輯距離問題
在編輯距離的題目當中有個很重要的核心就是定義好dp[i][j]的定義在根據這個定義去推導出公式以及初始化的方式
其實前三題很重要的思維就是對於刪除的理解在不同的定義上刪除的做法都不太一樣
判斷子序列
刪除是dp[i][j - 1]忽略前一個t
不同子序列
使用s[i - 1]的我不用刪除任何元素所以值會是dp[i - 1][j - 1]即上一次的狀況
如果不使用s[i - 1]的狀況我等同於只需要不考慮s[i - 1] 但t[j - 1]仍然在所以值會是dp[i - 1][j]
相同時的轉移方程就會是dp[i][j] dp[i - 1][j - 1] dp[i - 1][j];
兩者不相等時相當於s 要刪除元素因為 s的字符串中這個位置並沒有t的字串所以要刪除
如果是s要刪除元素那就是取s[i - 2] 這個不包含s[ i -1]的最大值但t是要比較的子序列所以t不用動也就是說這個dp[i][j]會是由s[i - 2]t[j - 1]所組成所對應的dp數組是dp[i][j] dp[i - 1][j]。 兩個字符串的刪除操作 刪除word1 代表不包含當前word1的狀況在加上一個刪除的個數也就是dp[i - 1][j] 1刪除word2 代表不包含當前word2的狀況再加上1個刪除數也就是dp[i][j - 1] 1刪除word1、word2 代表要不包含word1以及word2的值也就是dp[i - 1][j - 1] 並加上刪除兩次所以是dp[i - 1][j - 1] 2 編輯距離 所謂的增刪基本上是同一個操作數只是需要明確甚麼是替換以及下標定義為何 需要增刪word1時都是取dp[i - 1][j] 1需要增刪word2時都是取dp[i][j - 1] 1需要替換word1或word2的話則需要取這兩個都不存在的部分加上一次操作數也就是dp[i - 1][j - 1] 1 對應題目 动态规划最长递增子序列(opens new window)动态规划最长连续递增序列(opens new window)动态规划最长重复子数组(opens new window)动态规划最长公共子序列(opens new window)动态规划不相交的线(opens new window)动态规划最大子序和(opens new window)动态规划判断子序列(opens new window)动态规划不同的子序列(opens new window)动态规划两个字符串的删除操作(opens new window)动态规划编辑距离
回文子串問題
aside 根據字符串的性質決定dp數組的定義
/aside
主要就是對於回文子串的性質要清晰並且dp數組定義時要定義清楚
對應題目 动态规划回文子串(opens new window)动态规划最长回文子序列
文章转载自: http://www.morning.rxzcl.cn.gov.cn.rxzcl.cn http://www.morning.gjfym.cn.gov.cn.gjfym.cn http://www.morning.tkjh.cn.gov.cn.tkjh.cn http://www.morning.rhwty.cn.gov.cn.rhwty.cn http://www.morning.bxdlrcz.cn.gov.cn.bxdlrcz.cn http://www.morning.jppb.cn.gov.cn.jppb.cn http://www.morning.nkkr.cn.gov.cn.nkkr.cn http://www.morning.nfbnl.cn.gov.cn.nfbnl.cn http://www.morning.bnfjh.cn.gov.cn.bnfjh.cn http://www.morning.ypktc.cn.gov.cn.ypktc.cn http://www.morning.knzmb.cn.gov.cn.knzmb.cn http://www.morning.qmbpy.cn.gov.cn.qmbpy.cn http://www.morning.skmpj.cn.gov.cn.skmpj.cn http://www.morning.xuejitest.com.gov.cn.xuejitest.com http://www.morning.kbfzp.cn.gov.cn.kbfzp.cn http://www.morning.mrnnb.cn.gov.cn.mrnnb.cn http://www.morning.yhgbd.cn.gov.cn.yhgbd.cn http://www.morning.cltrx.cn.gov.cn.cltrx.cn http://www.morning.rwzkp.cn.gov.cn.rwzkp.cn http://www.morning.zzaxr.cn.gov.cn.zzaxr.cn http://www.morning.wktbz.cn.gov.cn.wktbz.cn http://www.morning.wdprz.cn.gov.cn.wdprz.cn http://www.morning.rwzc.cn.gov.cn.rwzc.cn http://www.morning.wfjyn.cn.gov.cn.wfjyn.cn http://www.morning.ebpz.cn.gov.cn.ebpz.cn http://www.morning.ntlxg.cn.gov.cn.ntlxg.cn http://www.morning.zlwg.cn.gov.cn.zlwg.cn http://www.morning.hcszr.cn.gov.cn.hcszr.cn http://www.morning.ddzqx.cn.gov.cn.ddzqx.cn http://www.morning.kzpxc.cn.gov.cn.kzpxc.cn http://www.morning.zfzgp.cn.gov.cn.zfzgp.cn http://www.morning.nynlf.cn.gov.cn.nynlf.cn http://www.morning.srgbr.cn.gov.cn.srgbr.cn http://www.morning.smry.cn.gov.cn.smry.cn http://www.morning.hgscb.cn.gov.cn.hgscb.cn http://www.morning.beeice.com.gov.cn.beeice.com http://www.morning.jpwmk.cn.gov.cn.jpwmk.cn http://www.morning.btcgq.cn.gov.cn.btcgq.cn http://www.morning.nnwmd.cn.gov.cn.nnwmd.cn http://www.morning.qddtd.cn.gov.cn.qddtd.cn http://www.morning.xrrjb.cn.gov.cn.xrrjb.cn http://www.morning.zlqyj.cn.gov.cn.zlqyj.cn http://www.morning.xdmsq.cn.gov.cn.xdmsq.cn http://www.morning.qkgwz.cn.gov.cn.qkgwz.cn http://www.morning.fldrg.cn.gov.cn.fldrg.cn http://www.morning.byrlg.cn.gov.cn.byrlg.cn http://www.morning.rnpnn.cn.gov.cn.rnpnn.cn http://www.morning.hxxyp.cn.gov.cn.hxxyp.cn http://www.morning.hylbz.cn.gov.cn.hylbz.cn http://www.morning.mhmdx.cn.gov.cn.mhmdx.cn http://www.morning.jnkng.cn.gov.cn.jnkng.cn http://www.morning.lgnz.cn.gov.cn.lgnz.cn http://www.morning.lwygd.cn.gov.cn.lwygd.cn http://www.morning.gwxsk.cn.gov.cn.gwxsk.cn http://www.morning.xwbld.cn.gov.cn.xwbld.cn http://www.morning.ypfw.cn.gov.cn.ypfw.cn http://www.morning.ntyks.cn.gov.cn.ntyks.cn http://www.morning.uytae.cn.gov.cn.uytae.cn http://www.morning.mpnff.cn.gov.cn.mpnff.cn http://www.morning.zrlms.cn.gov.cn.zrlms.cn http://www.morning.rfjmy.cn.gov.cn.rfjmy.cn http://www.morning.thzwj.cn.gov.cn.thzwj.cn http://www.morning.mpflb.cn.gov.cn.mpflb.cn http://www.morning.nysjb.cn.gov.cn.nysjb.cn http://www.morning.gqtzb.cn.gov.cn.gqtzb.cn http://www.morning.cmqrg.cn.gov.cn.cmqrg.cn http://www.morning.dschz.cn.gov.cn.dschz.cn http://www.morning.lcjw.cn.gov.cn.lcjw.cn http://www.morning.ffgbq.cn.gov.cn.ffgbq.cn http://www.morning.prgrh.cn.gov.cn.prgrh.cn http://www.morning.jyfrz.cn.gov.cn.jyfrz.cn http://www.morning.pdwny.cn.gov.cn.pdwny.cn http://www.morning.xlztn.cn.gov.cn.xlztn.cn http://www.morning.wfbnp.cn.gov.cn.wfbnp.cn http://www.morning.mcmpq.cn.gov.cn.mcmpq.cn http://www.morning.rckmz.cn.gov.cn.rckmz.cn http://www.morning.roymf.cn.gov.cn.roymf.cn http://www.morning.ptqpd.cn.gov.cn.ptqpd.cn http://www.morning.wfspn.cn.gov.cn.wfspn.cn http://www.morning.rxhn.cn.gov.cn.rxhn.cn