(1)定義狀態
(2)狀態轉移方程:
不選擇 nums[i],如果在 [0, i - 1] 這個子區間內已經有一部分元素,使得它們的和為 j ,那麼 dp[i][j] = true;
選擇 nums[i],如果在 [0, i - 1] 這個子區間內就得找到一部分元素,使得它們的和為 j - nums[i]。
(3)邊界條件:j - nums[i]
作為陣列的下標,一定得保證大於等於0
,因此nums[i] <= j
;
(4)初始化:dp[i][0]=true, dp[0][j]=false;
class solution
else}}
return dp[n][w];}};
思路:可以求n以內的完全平方數,然後就類似於零錢兌換題(硬幣價值).
注:動規非最優解。
(1)定義狀態dp[i]:表示能夠組合成 i 的最小完全平方個數
(2)狀態轉移:dp[i]=min(dp[i-coins[j]]+1)
(3)初始值:dp[0]=0;
(1)定義狀態dp[i][j]:可到達(i,j) 時的路徑總數
(2)狀態轉移:因為只能右移和下移,所以考慮 dp[i][j] 和 dp[i-1][j] 、dp[i][j-1]的關係, 顯然:
dp[i][j]=dp[i-1][j]+dp[i][j-1];
(3)初始條件:第一行只能通過一直右移得到,第一列同理。
class solution ^f(i,n)" class="mathcode" src=""/>
(1)定義dp[i]:長度為 i 能構成的不同二叉搜尋樹的個數。
(2)狀態轉移:dp[i] += dp[j-1]*dp[i-j] (以 j 為根節點)
(3)初始值:空樹:dp[0]=1, 只有根:dp[1]=1;
class solution
}return dp[n];}};
遞迴解決: 給定乙個有序序列 1⋯n,為了構建出一棵二叉搜尋樹,我們可以遍歷每個數字 i,將該數字作為樹根,將1⋯(i−1) 序列作為左子樹,將 (i+1)⋯n 序列作為右子樹。接著我們可以按照同樣的方式遞迴構建左子樹和右子樹。
class solution ;
return recur(1,n);
}vectorrecur(int l, int r);
vectorres;
for(int i=l; i<=r; i++)}}
return res;}};
(1)定義狀態dp[i]:表示字串 s 前 i 個字元組成的字串 s[0..i-1] 是否能被空格拆分成若干個字典**現的單詞
(2)狀態轉移:每次轉移的時候我們需要列舉包含位置 i-1的最後乙個單詞,看它是否出現在字典中以及除去這部分的字串是否合法即可。
我們需要列舉 s[0..i-1] 中的分割點 j ,看 s[0..j-1] 組成的字串 s1 和 s[j..i−1] 組成的字串 s2 是否都合法,如果兩個字串均合法,那麼按照定義 s1 和 s2 拼接成的字串也同樣合法.
由於計算到 dp[i] 時我們已經計算出了 dp[0..i−1] 的值,因此字串 s1 是否合法可以直接由 dp[j] 得知,剩下的我們只需要看 s2 是否合法即可。即
(3)初始值:dp[0]=true
class solution
int n=s.size();
vectordp(n+1);
dp[0]=true;
for(int i=1; i<=n; i++)}}
return dp[n];}};
演算法題 leetcode200 島嶼數量
題目描述 給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。深度搜尋class solution return count public static void combine ...
leetcode200 島嶼個數
對方格中的每乙個點為起點進行遍歷。如果找到乙個為1的點,結果就更新。以該點為中心,搜尋四周的點 搜尋流程 如果越界,返回 如果是0,返回 向四周搜尋class solution object def numislands self,grid type grid list list str rtype...
LeetCode 200 島嶼數量
給定乙個由 1 陸地 和 0 水 組成的的二維網格,計算島嶼的數量。乙個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。示例 1 輸入 11110 11010 11000 00000輸出 1 示例 2 輸入 11000 11000 00100 00...