# 卿è§å
## èæ¯
å
ä»ä¸éé¢ç®å¼å§~
å¦é¢  [triangle](https://leetcode-cn.com/problems/triangle/)
> ç»å®ä¸ä¸ªä¸è§å½¢ï¼æ¾åºèªé¡¶åä¸çæå°è·¯å¾åãæ¯ä¸æ¥åªè½ç§»å¨å°ä¸ä¸è¡ä¸ç¸é»çç»ç¹ä¸ã
ä¾å¦ï¼ç»å®ä¸è§å½¢ï¼
```text
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
```
èªé¡¶åä¸çæå°è·¯å¾å为  11ï¼å³ï¼2 + 3 + 5 + 1 = 11ï¼ã
ä½¿ç¨ DFSï¼éå æè
åæ²»æ³ï¼
éå

```c++
class Solution {
public:
int best=INT_MAX;
int minimumTotal(vector>& triangle) {
if(triangle.size()==0||triangle[0].size()==0)
return 0;
dfs(triangle,0,0,0);
return best;
}
void dfs(vector>&triangle,int row,int col,int sum){
if(row==triangle.size()){
if(sum>& triangle) {
if(triangle.size()==0||triangle[0].size()==0)
return 0;
return dfs(triangle,0,0);
}
int dfs(vector>&triangle,int row,int col){
if(row==triangle.size()){
return 0;
}
return min(dfs(triangle,row+1,col),dfs(triangle,row+1,col+1))+triangle[row][col];
}
};
//è¶
æ¶
```
ä¼å DFSï¼ç¼åå·²ç»è¢«è®¡ç®çå¼ï¼ç§°ä¸ºï¼è®°å¿åæç´¢ æ¬è´¨ä¸ï¼å¨æè§åï¼--dpçèªé¡¶åä¸éå½å®ç°

```c++
class Solution {
public:
int minimumTotal(vector>& triangle) {
if(triangle.size()==0||triangle[0].size()==0)
return 0;
int rows=triangle.size();
vector>memo(rows,vector(rows,-1));
return dfs(triangle,0,0,memo);
}
int dfs(vector>&triangle,int i,int j,vector>&memo){
if(i==triangle.size())
return 0;
if(memo[i][j]!=-1)
return memo[i][j];
memo[i][j]=min(dfs(triangle,i+1,j+1,memo),dfs(triangle,i+1,j,memo))+triangle[i][j];
return memo[i][j];
}
};
```
卿è§åå°±æ¯æå¤§é®é¢åæå°é®é¢ï¼å¹¶è§£å³äºå°é®é¢éå¤è®¡ç®çæ¹æ³ç§°ä¸ºå¨æè§å
卿è§åå DFS åºå«
- äºåæ åé®é¢æ¯æ²¡æäº¤éï¼æä»¥å¤§é¨åäºåæ é½ç¨é彿è
åæ²»æ³ï¼å³ DFSï¼å°±å¯ä»¥è§£å³
- å triangle è¿ç§æ¯æéå¤èµ°çæ
åµï¼**åé®é¢æ¯æäº¤é**ï¼æä»¥å¯ä»¥ç¨å¨æè§åæ¥è§£å³
卿è§åï¼èªåºåä¸bottom-up/table-fillè¿ä»£:dp[i][j] 表示ä»i,jåºåï¼å°è¾¾æåä¸å±çæçè·¯å¾
```c++
class Solution {
public:
int best=INT_MAX;
int minimumTotal(vector>& triangle) {
if(triangle.size()==0||triangle[0].size()==0)
return 0;
int n=triangle.size();
//1ãç¶æå®ä¹ï¼dp[i][j] 表示ä»i,jåºåï¼å°è¾¾æåä¸å±çæçè·¯å¾
// 2ãåå§å
//why+1:// æåºè¡åèç¹çæå°è·¯å¾å为èç¹å¼æ¬èº«,ç¨æ¥å¨éæ¨ä¸ä¹ç´æ¥åå§åæåä¸è¡
vector>dp(n+1,vector(n+1,0));
// 3ã鿍æ±è§£
for(int i=n-1;i>=0;--i){
for(int j=0;j<=i;++j){
// (i,j)åªè½ç±(i+1,j)å(i+1,j+1)两个已被ææå¡«å
çèç¹åæ¨
dp[i][j]=min(dp[i+1][j],dp[i+1][j+1])+triangle[i][j];
}
}
// 4ãçæ¡
return dp[0][0];
}
};
//空é´ä¼åï¼è®¡ç®dp[i][j]æ¶ï¼åªç¨å°äºä¸ä¸è¡çdp[i + 1][j]å dp[i + 1][j + 1]ãå æ¤ dpæ°ç»ä¸éè¦å®ä¹Nè¡ï¼åªè¦å®ä¹1è¡ãä¿®æ¹ä¸ä¸ä¸è¿°ä»£ç ï¼å°iæå¨çç»´åº¦å»æï¼å°±å¯ä»¥å° O(N^2)ç空é´å¤æåº¦ä¼åæ O(N)
//龿¥ï¼https://leetcode-cn.com/problems/triangle/solution/di-gui-ji-yi-hua-dp-bi-xu-miao-dong-by-sweetiee/
class Solution {
public:
int best=INT_MAX;
int minimumTotal(vector>& triangle) {
if(triangle.size()==0||triangle[0].size()==0)
return 0;
int n=triangle.size();
vectordp(n+1,0);
for(int i=n-1;i>=0;--i){
for(int j=0;j<=i;++j){
dp[j]=min(dp[j],dp[j+1])+triangle[i][j];
}
}
return dp[0];
}
};
```
卿è§åï¼èªé¡¶åä¸top-down:dp[i][j]å®ä¹ä¸ºä»0ï¼0åºåï¼å°è¾¾iï¼jçæçè·¯å¾
```c++
class Solution {
public:
int minimumTotal(vector>& triangle) {
if(triangle.size()==0||triangle[0].size()==0)
return 0;
int n=triangle.size();
//1.ç¶æå®ä¹ï¼dp[i][j]å®ä¹ä¸ºä»0ï¼0åºåï¼å°è¾¾iï¼jçæçè·¯å¾
vector>dp(n,vector(n));
//2.åå§å
dp[0][0]=triangle[0][0];
//3.é彿±è§£ï¼ç¶æè½¬ç§»æ¹ç¨ä¸ºdp[i][j]=min(dp[iâ1][jâ1],dp[iâ1][j])+c[i][j]
for(int i=1;i 注æç¹
>
> - è´ªå¿ç®æ³å¤§å¤é¢ç®é èçæ¡ï¼æä»¥å¦æè½ç¨å¨æè§å就尽éç¨å¨è§ï¼ä¸ç¨è´ªå¿ç®æ³
## 1ãç©éµç±»åï¼10%ï¼
### [minimum-path-sum](https://leetcode-cn.com/problems/minimum-path-sum/)
> ç»å®ä¸ä¸ªå
å«éè´æ´æ°ç  *m* x *n*Â ç½æ ¼ï¼è¯·æ¾åºä¸æ¡ä»å·¦ä¸è§å°å³ä¸è§çè·¯å¾ï¼ä½¿å¾è·¯å¾ä¸çæ°åæ»å为æå°ã
æè·¯ï¼1.卿è§å-top-down:dp[i][j]ä»èµ·ç¹èµ°å° i,j çæçè·¯å¾
1ãstate: f[x][y]ä»èµ·ç¹èµ°å° x,y çæçè·¯å¾
2ãfunction: f[x][y] = min(f[x-1][y], f[x][y-1]) + A[x][y]
3ãintialize: f[0][0] = A[0][0]ãf[i][0] = sum(0,0 -> i,0)ã f[0][i] = sum(0,0 -> 0,i)
4ãanswer: f[n-1][m-1]
```c++
class Solution {
public:
int minPathSum(vector>& grid) {
if(grid.size()==0||grid[0].size()==0)
return 0;
int m=grid.size(),n=grid[0].size();
vector>dp(m,vector(n,-1));
dp[0][0]=grid[0][0];
for(int k=1;k>& grid) {
int row = grid.size();
if(row == 0)return 0;
int col = grid[0].size();
if(col == 0)return 0;
for(int i = 0; i < row; i++){
for(int j = 0 ;j < col; j++){
if( i == 0 &&j == 0)continue;
if(i == 0){
grid[0][j] += grid[0][ j - 1];
continue;
}
if(j == 0){
grid[i][0] += grid[i - 1][0];
continue;
}
grid[i][j] = min(grid[i - 1][j],grid[i][j - 1]) + grid[i][j];
}
}
return grid[row - 1][col - 1];
}
};
//2.bottom-up: //dp[i][j]为ä»iï¼jåºåå°è¾¾ç»ç¹çæçè·¯å¾å
class Solution {
public:
int minPathSum(vector>& grid) {
if(grid.size()==0||grid[0].size()==0)
return 0;
int m=grid.size(),n=grid[0].size();
//dp[i][j]为ä»iï¼jåºåå°è¾¾ç»ç¹çæçè·¯å¾å
vector>dp(m,vector(n,-1));
dp[m-1][n-1]=grid[m-1][n-1];
for(int k=m-2;k>=0;--k)
dp[k][n-1]=dp[k+1][n-1]+grid[k][n-1];
for(int l=n-2;l>=0;--l)
dp[m-1][l]=dp[m-1][l+1]+grid[m-1][l];
for(int i=m-2;i>=0;--i){
for(int j=n-2;j>=0;--j){
dp[i][j]=min(dp[i+1][j],dp[i][j+1])+grid[i][j];
}
}
return dp[0][0];
}
};
```
### [unique-paths](https://leetcode-cn.com/problems/unique-paths/)
> ä¸ä¸ªæºå¨äººä½äºä¸ä¸ª m x n ç½æ ¼çå·¦ä¸è§ ï¼èµ·å§ç¹å¨ä¸å¾ä¸æ 记为âStartâ ï¼ã
> æºå¨äººæ¯æ¬¡åªè½å䏿è
åå³ç§»å¨ä¸æ¥ãæºå¨äººè¯å¾è¾¾å°ç½æ ¼çå³ä¸è§ï¼å¨ä¸å¾ä¸æ 记为âFinishâï¼ã
> 鮿»å
±æå¤å°æ¡ä¸åçè·¯å¾ï¼
```c++
class Solution {
public:
int uniquePaths(int m, int n) {
if(m<=0||n<=0)
return 0;
//dp[i][j]å®ä¹ä¸ºä»åç¹åºåï¼å°è¾¾iï¼jçè·¯å¾ä¸ªæ°å
vector>dp(m,vector(n,1));
dp[0][0]=1;
for(int k=1;k>dp(m,vector(n,-1));
dp[m-1][n-1]=1;
for(int k=m-2;k>=0;--k)
dp[k][n-1]=dp[k+1][n-1];
for(int l=n-2;l>=0;--l)
dp[m-1][l]=dp[m-1][l+1];
for(int i=m-2;i>=0;--i){
for(int j=n-2;j>=0;--j){
dp[i][j]=dp[i+1][j]+dp[i][j+1];
}
}
return dp[0][0];
}
};
```
### [unique-paths-ii](https://leetcode-cn.com/problems/unique-paths-ii/)
> ä¸ä¸ªæºå¨äººä½äºä¸ä¸ª m x n ç½æ ¼çå·¦ä¸è§ ï¼èµ·å§ç¹å¨ä¸å¾ä¸æ 记为âStartâ ï¼ã
> æºå¨äººæ¯æ¬¡åªè½å䏿è
åå³ç§»å¨ä¸æ¥ãæºå¨äººè¯å¾è¾¾å°ç½æ ¼çå³ä¸è§ï¼å¨ä¸å¾ä¸æ 记为âFinishâï¼ã
> 鮿»å
±æå¤å°æ¡ä¸åçè·¯å¾ï¼
> ç°å¨èèç½æ ¼ä¸æéç¢ç©ãé£ä¹ä»å·¦ä¸è§å°å³ä¸è§å°ä¼æå¤å°æ¡ä¸åçè·¯å¾ï¼
```c++
class Solution {
public:
int uniquePathsWithObstacles(vector>& obstacleGrid) {
int m=obstacleGrid.size(),n=obstacleGrid[0].size();
if(m<=0||n<=0)
return 0;
//dp[i][j]å®ä¹ä¸ºä»åç¹åºåï¼å°è¾¾iï¼jçè·¯å¾ä¸ªæ°å
vector>dp(m,vector(n,0));
if(obstacleGrid[0][0]==0)
dp[0][0]=1;
for(int k=1;k åè®¾ä½ æ£å¨ç¬æ¥¼æ¢¯ãéè¦ Â *n* é¶ä½ æè½å°è¾¾æ¥¼é¡¶ã
```c++
class Solution {
public:
int climbStairs(int n) {
if(n<=0)
return 0;
if(n<=2)
return n;
//dp[i]å®ä¹ä¸ºè·å°å°é¶iå
±æå¤å°æ¹æ³
vectordp(n+1,0);
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n;++i){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
};
```
### [jump-game](https://leetcode-cn.com/problems/jump-game/)
> ç»å®ä¸ä¸ªéè´æ´æ°æ°ç»ï¼ä½ æåä½äºæ°ç»ç第ä¸ä¸ªä½ç½®ã
> æ°ç»ä¸çæ¯ä¸ªå
ç´ ä»£è¡¨ä½ å¨è¯¥ä½ç½®å¯ä»¥è·³è·çæå¤§é¿åº¦ã
> å¤æä½ æ¯å¦è½å¤å°è¾¾æåä¸ä¸ªä½ç½®ã
```c++
//greedy
class Solution {
public:
bool canJump(vector& nums) {
int n = nums.size();
int rightmost = 0;
for (int i = 0; i < n; ++i) {
if (i <= rightmost) {
rightmost = max(rightmost, i + nums[i]);
if (rightmost >= n - 1) {
return true;
}
}
}
return false;
}
}
//class Solution {
public:
bool canJump(vector& nums) {
if(nums.empty())
return true;
int n=nums.size();
//dp[i]代表索å¼içä½ç½®è½å¦å°è¾¾
vectordp(n,0);
dp[0]=true;
for(int i=1;i=i)
{
dp[i]=true;
break;
}
}
return dp[n-1];
}
};
//chao shi,****
```
### [jump-game-ii](https://leetcode-cn.com/problems/jump-game-ii/)
> ç»å®ä¸ä¸ªéè´æ´æ°æ°ç»ï¼ä½ æåä½äºæ°ç»ç第ä¸ä¸ªä½ç½®ã
> æ°ç»ä¸çæ¯ä¸ªå
ç´ ä»£è¡¨ä½ å¨è¯¥ä½ç½®å¯ä»¥è·³è·çæå¤§é¿åº¦ã
> ä½ çç®æ æ¯ä½¿ç¨æå°çè·³è·æ¬¡æ°å°è¾¾æ°ç»çæåä¸ä¸ªä½ç½®ã
```c++
//top-down(c++è¶
æ¶ï¼
// ç¶æï¼f[i] 表示ä»èµ·ç¹å°å½åä½ç½®æå°æ¬¡æ°
// æ¨å¯¼ï¼f[i] = f[j],a[j]+j >=i,min(f[j]+1)
// åå§åï¼f[0] = 0
// ç»æï¼f[n-1]
class Solution {
public:
int jump(vector& nums) {
if(nums.empty())
return 0;
//dp[i]表示ä»åå§ä½ç½®å°ç´¢å¼içæå°è·³è·æ¬¡æ°
vectordp(nums.size(),0);
dp[0]=0;
for(int i=1;i=i){
// åä¸ä¸ªæå°å¼+1
dp[i]=min(dp[i],dp[j]+1);
}
}
}
return dp[nums.size()-1];
}
};
//greedy
class Solution {
//ãè´ªå¿ãå°è¿è¡æ£åæ¥æ¾ï¼æ¯æ¬¡æ¾å°å¯å°è¾¾çæè¿ä½ç½®ï¼å°±å¯ä»¥å¨çº¿æ§æ¶é´å
å¾å°æå°çè·³è·æ¬¡æ°ã
//å¨å
·ä½çå®ç°ä¸ï¼æä»¬ç»´æ¤å½åè½å¤å°è¾¾çæå¤§ä¸æ ä½ç½®ï¼è®°ä¸ºè¾¹çãæä»¬ä»å·¦å°å³éåæ°ç»ï¼å°è¾¾è¾¹çæ¶ï¼æ´æ°è¾¹çå¹¶å°è·³è·æ¬¡æ°å¢å 1ã
public:
int jump(vector& nums) {
if(nums.empty())
return 0;
int maxpos=0,end=0,times=0;
//å¨éåæ°ç»æ¶ï¼æä»¬ä¸è®¿é®æåä¸ä¸ªå
ç´ ï¼è¿æ¯å 为å¨è®¿é®æåä¸ä¸ªå
ç´ ä¹åï¼æä»¬çè¾¹çä¸å®å¤§äºçäºæåä¸ä¸ªä½ç½®ï¼å¦åå°±æ æ³è·³å°æåä¸ä¸ªä½ç½®äºã
//å¦æè®¿é®æåä¸ä¸ªå
ç´ ï¼å¨è¾¹çæ£å¥½ä¸ºæåä¸ä¸ªä½ç½®çæ
åµä¸ï¼æä»¬ä¼å¢å 䏿¬¡ãä¸å¿
è¦çè·³è·æ¬¡æ°ãï¼å æ¤æä»¬ä¸å¿
è®¿é®æåä¸ä¸ªå
ç´ ã
for(int i=0;i=i){
maxpos=max(maxpos,nums[i]+i);
if(i==end){
end=maxpos;
times++;
}
}
}
return times;
}
};
```
### [palindrome-partitioning-ii](https://leetcode-cn.com/problems/palindrome-partitioning-ii/)
> ç»å®ä¸ä¸ªå符串 _s_ï¼å° _s_ å岿ä¸äºå串ï¼ä½¿æ¯ä¸ªå䏲齿¯åæä¸²ã
> è¿å符åè¦æ±çæå°å岿¬¡æ°ã
```c++
//è¶
æ¶
class Solution {
public:
int minCut(string s) {
if(s.size()<2)
return 0;
//æ¥éª¤ 1ï¼æèç¶æ
//dp[i]表示åç¼å串 s[0:i] å岿è¥å¹²ä¸ªåæå串æéè¦æå°å岿¬¡æ°
//æ¥éª¤ 2ï¼æèç¶æè½¬ç§»æ¹ç¨
//dp[i] = min([dp[j] + 1 for j in range(i) if s[j + 1, i] æ¯åæ])
vectordp(s.size());
//æ¥éª¤ 3ï¼æèåå§ç¶æ
//åå§ç¶æï¼å个å符ä¸å®æ¯åæä¸²ï¼å æ¤ dp[0] = 0ã
dp[0]=0;
for(int i=1;i ç»å®ä¸ä¸ªæ åºçæ´æ°æ°ç»ï¼æ¾å°å
¶ä¸æé¿ä¸åååºåçé¿åº¦ã
```c++
//dp:å®ä¹ dp[i]为èèåi个å
ç´ ï¼ä»¥ç¬¬i个æ°åç»å°¾çæé¿ä¸åååºåçé¿åº¦ï¼æ³¨æ nums[i] å¿
须被éå,å¦å为1ã
class Solution {
public:
int lengthOfLIS(vector& nums) {
int n=(int)nums.size();
if (n == 0) return 0;
vector dp(n, 0);
for (int i = 0; i < n; ++i) {
dp[i] = 1;
for (int j = 0; j < i; ++j) {
if (nums[j] < nums[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
return *max_element(dp.begin(), dp.end());
}
};
//greedyï¼
class Solution {
public:
int lengthOfLIS(vector& nums) {
int len = 1, n = (int)nums.size();
if (n == 0) return 0;
vector d(n + 1, 0);
d[len] = nums[0];
for (int i = 1; i < n; ++i) {
if (nums[i] > d[len]) d[++len] = nums[i];
else{
int l = 1, r = len, pos = 0; // 妿æ¾ä¸å°è¯´æææçæ°é½æ¯ nums[i] å¤§ï¼æ¤æ¶è¦æ´æ° d[1]ï¼æä»¥è¿éå° pos 设为 0
while (l <= r) {
int mid = (l + r) >> 1;
if (d[mid] < nums[i]) {
pos = mid;
l = mid + 1;
}
else r = mid - 1;
}
d[pos + 1] = nums[i];
}
}
return len;
}
};
ä½è
ï¼LeetCode-Solution
龿¥ï¼https://leetcode-cn.com/problems/longest-increasing-subsequence/solution/zui-chang-shang-sheng-zi-xu-lie-by-leetcode-soluti/
```
### [word-break](https://leetcode-cn.com/problems/word-break/)
> ç»å®ä¸ä¸ª**é空**å符串  *s* åä¸ä¸ªå
å«**é空**åè¯å表çåå
¸  *wordDict*ï¼å¤å®  *s* æ¯å¦å¯ä»¥è¢«ç©ºæ ¼æå为ä¸ä¸ªæå¤ä¸ªå¨åå
¸ä¸åºç°çåè¯ã
```c++
//å®ä¹dp[i] 表示å符串så i 个åç¬¦ç»æçå符串 s[0..i-1]æ¯å¦è½è¢«ç©ºæ ¼æåæè¥å¹²ä¸ªåå
¸ä¸åºç°çåè¯ãä»åå¾å计ç®èè转移æ¹ç¨ï¼æ¯æ¬¡è½¬ç§»çæ¶åæä»¬éè¦æä¸¾å
å«ä½ç½® i-1çæåä¸ä¸ªåè¯ï¼ç宿¯å¦åºç°å¨åå
¸ä¸ä»¥åé¤å»è¿é¨åçå符串æ¯å¦åæ³å³å¯
//dp[i] 表示åi个å符æ¯å¦å¯ä»¥è¢«åå
// dp[i] = dp[j] && s[j+1~i] in wordDict
// dp[0] = true
// return dp[len]
class Solution {
public:
bool wordBreak(string s, vector& wordDict) {
auto wordDictSet = unordered_set ();
//ç¨äºåªæ
int maxlen=0;
for (auto word: wordDict) {
maxlen=max(maxlen,(int)word.size());
wordDictSet.insert(word);
}
auto dp = vector (s.size() + 1);
dp[0] = true;
for (int i = 1; i <= s.size(); ++i) {
for (int j = 0; j < i; ++j) {
if (dp[j] && i-j<=maxlen&&wordDictSet.find(s.substr(j, i - j)) != wordDictSet.end()) {
dp[i] = true;
break;
}
}
}
return dp[s.size()];
}
};
```
å°ç»
常è§å¤çæ¹å¼æ¯ç» 0 ä½ç½®å ä½ï¼è¿æ ·å¤çé®é¢æ¶ä¸è§åä»ï¼åå§ååå¨åæ¥åºç¡ä¸ length+1ï¼è¿åç»æ f[n]
- ç¶æå¯ä»¥ä¸ºå i 个
- åå§å length+1
- åå¼ index=i-1
- è¿åå¼ï¼f[n]æè
f[m][n]
## Two Sequences DPï¼40%ï¼
### [longest-common-subsequence](https://leetcode-cn.com/problems/longest-common-subsequence/)
> ç»å®ä¸¤ä¸ªå符串  text1 å  text2ï¼è¿åè¿ä¸¤ä¸ªå符串çæé¿å
Œ
±ååºåã
> ä¸ä¸ªå符串ç  ååºå Â æ¯æè¿æ ·ä¸ä¸ªæ°çå符串ï¼å®æ¯ç±åå符串å¨ä¸æ¹åå符çç¸å¯¹é¡ºåºçæ
åµä¸å 餿äºå符ï¼ä¹å¯ä»¥ä¸å é¤ä»»ä½å符ï¼åç»æçæ°å符串ã
> ä¾å¦ï¼"ace" æ¯ "abcde" çååºåï¼ä½ "aec" 䏿¯ "abcde" çååºåã两个å符串çãå
Œ
±ååºåãæ¯è¿ä¸¤ä¸ªå符串æå
±åæ¥æçååºåã
```c++
// dp[i][j] aåi个åbåj个å符æé¿å
Œ
±ååºå
// dp[m+1][n+1]
// # ' a d c e
// ' 0 0 0 0 0
// a 0 1 1 1 1
// c 0 1 1 2 1
//
//ç¨ä¸¤ä¸ªæé i å j ä»åå¾åéå s1 å s2ï¼å¦æ s1[i]==s2[j]ï¼é£ä¹è¿ä¸ªå符ä¸å®å¨ lcs ä¸ï¼å¦åçè¯ï¼s1[i] å s2[j] è¿ä¸¤ä¸ªå符è³å°æä¸ä¸ªä¸å¨ lcs ä¸ï¼éè¦ä¸¢å¼ä¸ä¸ªã
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
if(text1.empty()||text2.empty())
return 0;
int m=text1.size(),n=text2.size();
vector>dp(m+1,vector(n+1,0));
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j){
// t1第i个å
ç´ ï¼ç´¢å¼ä¸ºi-1ï¼åt2第j个å
ç´ ç¸çåå·¦ä¸å
ç´ +1ï¼å¦ååå·¦æä¸çè¾å¤§å¼
if(text1[i-1]==text2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[m][n];
}
};
```
- ä» 1 å¼å§éå尿大é¿åº¦
- ç´¢å¼éè¦åä¸
### [edit-distance](https://leetcode-cn.com/problems/edit-distance/)
> ç»ä½ 两个åè¯ Â word1 å  word2ï¼è¯·ä½ 计ç®åºå°  word1Â è½¬æ¢æ  word2 æä½¿ç¨çæå°æä½æ° Â
> ä½ å¯ä»¥å¯¹ä¸ä¸ªåè¯è¿è¡å¦ä¸ä¸ç§æä½ï¼
> æå
¥ä¸ä¸ªå符
> å é¤ä¸ä¸ªå符
> æ¿æ¢ä¸ä¸ªå符
æè·¯ï¼åä¸é¢å¾ç±»ä¼¼ï¼ç¸çåä¸éè¦æä½ï¼å¦ååå é¤ãæå
¥ãæ¿æ¢æå°æä½æ¬¡æ°çå¼+1
```c++
// dp[i][j] 表示aå符串çåi个å符ç¼è¾ä¸ºbå符串çåj个å符æå°éè¦å¤å°æ¬¡æä½
// dp[i][j] = OR(dp[i-1][j-1]ï¼a[i]==b[j],min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1)
class Solution {
public:
int minDistance(string word1, string word2) {
int m=word1.size(),n=word2.size();
vector>dp(m+1,vector(n+1,0));
for(int k=0;k<=m;++k)
dp[k][0]=k;
for(int l=0;l<=n;++l)
dp[0][l]=l;
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j){
// ç¸çåä¸éè¦æä½
if(word1[i-1]==word2[j-1])
dp[i][j]=dp[i-1][j-1];
else
// å¦ååå é¤ãæå
¥ãæ¿æ¢æå°æä½æ¬¡æ°çå¼+1
dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
}
}
return dp[m][n];
}
};
```
说æ
> å¦å¤ä¸ç§åæ³ï¼MAXLEN(a,b)-LCS(a,b)
## é¶é±åèå
ï¼10%ï¼
### [coin-change](https://leetcode-cn.com/problems/coin-change/)
> ç»å®ä¸åé¢é¢çç¡¬å¸ coins åä¸ä¸ªæ»éé¢ amountãç¼åä¸ä¸ªå½æ°æ¥è®¡ç®å¯ä»¥åææ»é颿éçæå°ç硬å¸ä¸ªæ°ãå¦ææ²¡æä»»ä½ä¸ç§ç¡¬å¸ç»åè½ç»ææ»éé¢ï¼è¿å  -1ã
æè·¯ï¼åå
¶ä» DP ä¸å¤ªä¸æ ·ï¼i è¡¨ç¤ºé±æè
容é
```c++
class Solution {
public:
int coinChange(vector& coins, int amount) {
// ç¶æ dp[i]表示éé¢ä¸ºiæ¶ï¼ç»æçæå°ç¡¬å¸ä¸ªæ°
// æ¨å¯¼ dp[i] = min(dp[i-1], dp[i-2], dp[i-5])+1, åæ i-coins[j] > 0
// åå§å为æå¤§å¼ dp[i]=amount+1
// è¿åå¼ dp[n] or dp[n]>amount =>-1
vectordp(amount+1,amount+1);
dp[0]=0;
for(int i=1;i<=amount;++i){
for(int j=0;j=0){
dp[i]=min(dp[i],dp[i-coins[j]]+1);
}
}
}
if(dp[amount]>amount)
return -1;
return dp[amount];
}
};
```
注æ
> dp[i-a[j]] å³ç a[j]æ¯å¦åä¸
### [backpack](https://www.lintcode.com/problem/backpack/description)
> å¨ n 个ç©å䏿éè¥å¹²ç©åè£
å
¥èå
ï¼æå¤è½è£
夿»¡ï¼å设èå
ç大å°ä¸º mï¼æ¯ä¸ªç©åç大å°ä¸º A[i]
```c++
class Solution {
public:
/**
* @param m: An integer m denotes the size of a backpack
* @param A: Given n items with size A[i]
* @return: The maximum size
*/
int backPack(int m, vector &A) {
// write your code here
// dp[i][j] ç¨ä»»ææ°éçåiç§ç©åï¼æ¯å¦è½è£
jç大å°
// dp[i][j] =dp[i-1][j] || dp[i-1][j-a[i]] j>a[i]
// dp[0][0]=true dp[...][0]=true(å0ä»¶ï¼
// dp[n][X]
vector>dp(A.size()+1,vector(m+1));
dp[0][0]=true;
for(int i=1;i<=A.size();++i){
for(int j=0;j<=m;++j){
dp[i][j]=dp[i-1][j];
if(j-A[i-1]>=0&&dp[i-1][j-A[i-1]])
dp[i][j]=true;
}
}
for(int k=m;k>=0;--k){
if(dp[A.size()][k]==true)
return k;
}
return 0;
}
};
```
### [backpack-ii](https://www.lintcode.com/problem/backpack-ii/description)
> æ `n` 个ç©ååä¸ä¸ªå¤§å°ä¸º `m` çèå
. ç»å®æ°ç» `A` 表示æ¯ä¸ªç©åç大å°åæ°ç» `V` 表示æ¯ä¸ªç©åçä»·å¼.
> 鮿å¤è½è£
å
¥èå
çæ»ä»·å¼æ¯å¤å¤§?
æè·¯ï¼dp[i][j] å i 个ç©åï¼è£
å
¥ j èå
æå¤§ä»·å¼
```c++
class Solution {
public:
/**
* @param m: An integer m denotes the size of a backpack
* @param A: Given n items with size A[i]
* @param V: Given n items with value V[i]
* @return: The maximum value
*/
int backPackII(int m, vector &A, vector &V) {
// write your code here
// dp[i][j] ç¨ä»»ææ°éçåiç§ç©åï¼è£
å
¥èå
为 j大å°ï¼ä»·å¼æå¤§
// dp[i][j] =max(dp[i-1][j] , dp[i-1][j-a[i]]+v[i]) , j>a[i] æ¯å¦å å
¥A[i]ç©å
// dp[0][0]=0 dp[...][0]=0
// dp[n][X]
vector>dp(A.size()+1,vector(m+1));
dp[0][0]=0;
for(int i=1;i<=A.size();++i){
for(int j=0;j<=m;++j){
dp[i][j]=dp[i-1][j];
if(j-A[i-1]>=0)
dp[i][j]=max(dp[i-1][j],dp[i-1][j-A[i-1]]+V[i-1]);
}
}
return dp[A.size()][m];
}
};
```
## ç»ä¹
Matrix DP (10%)
- [ ] [triangle](https://leetcode-cn.com/problems/triangle/)
- [ ] [minimum-path-sum](https://leetcode-cn.com/problems/minimum-path-sum/)
- [ ] [unique-paths](https://leetcode-cn.com/problems/unique-paths/)
- [ ] [unique-paths-ii](https://leetcode-cn.com/problems/unique-paths-ii/)
Sequence (40%)
- [ ] [climbing-stairs](https://leetcode-cn.com/problems/climbing-stairs/)
- [ ] [jump-game](https://leetcode-cn.com/problems/jump-game/)
- [ ] [jump-game-ii](https://leetcode-cn.com/problems/jump-game-ii/)
- [ ] [palindrome-partitioning-ii](https://leetcode-cn.com/problems/palindrome-partitioning-ii/)
- [ ] [longest-increasing-subsequence](https://leetcode-cn.com/problems/longest-increasing-subsequence/)
- [ ] [word-break](https://leetcode-cn.com/problems/word-break/)
Two Sequences DP (40%)
- [ ] [longest-common-subsequence](https://leetcode-cn.com/problems/longest-common-subsequence/)
- [ ] [edit-distance](https://leetcode-cn.com/problems/edit-distance/)
Backpack & Coin Change (10%)
- [ ] [coin-change](https://leetcode-cn.com/problems/coin-change/)
- [ ] [backpack](https://www.lintcode.com/problem/backpack/description)
- [ ] [backpack-ii](https://www.lintcode.com/problem/backpack-ii/description)