力扣热题之多维动态规划
焦虑ing,赶快把力扣100刷完去看大模拟了。。
1.不同路径
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector<int>(n,0));for(int i=0;i<m;i++) dp[i][0]=1;for(int i=0;i<n;i++) dp[0][i]=1;if(m==1) return dp[0][n-1];if(n==1) return dp[m-1][0];for(int i=1;i<m;i++){for(int j=1;j<n;j++){dp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m-1][n-1];}
};
2.最小路径和
class Solution {
public:int minPathSum(vector<vector<int>>& grid) {int m=grid.size();int n=grid[0].size();vector<vector<int>> dp(m,vector<int>(n,0));dp[0][0]=grid[0][0];for(int i=1;i<m;i++){dp[i][0]=dp[i-1][0]+grid[i][0];}for(int i=1;i<n;i++)dp[0][i]=dp[0][i-1]+grid[0][i];if(m==1) return dp[0][n-1];if(n==1) return dp[m-1][0];for(int i=1;i<m;i++){for(int j=1;j<n;j++){dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];}}return dp[m-1][n-1];}
};
3.最长回文字串
这个我之前尝试过,一年半以前,看看一年半后有没有长近orz
还是不会,靠。我又会了,画个图又行了。果然是有长近的
class Solution {
public:string longestPalindrome(string s) {if(s.size()==0||s.size()==1) return s;int n=s.size();vector<vector<int>> dp(n,vector<int>(n,-1));int left=0;int right=0;int ans=1;for(int i=0;i<n;i++) dp[i][i]=1;for(int i=0;i<n-1;i++){if(s[i]==s[i+1]){dp[i][i+1]=2;left=i;right=i+1;ans=2;}}for(int gap=2;gap<n;gap++){for(int i=0;i<n-gap;i++){int j=i+gap;if(dp[i+1][j-1]!=-1&&s[i]==s[j]) {dp[i][j]=dp[i+1][j-1]+2;if(dp[i][j]>ans){left=i;right=j;ans=dp[i][j];}}}}return s.substr(left,right-left+1);}
};
4.最长公共子序列
力扣的提示很到位
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int m=text1.size();int n=text2.size();vector<vector<int>> dp(m,vector<int>(n,0));//初始化for(int i=0;i<m;i++){if(text1[i]==text2[0]) dp[i][0]=1;if(i>0) dp[i][0]=max(dp[i][0],dp[i-1][0]);}for(int j=0;j<n;j++){if(text1[0]==text2[j]) dp[0][j]=1;if(j>0) dp[0][j]=max(dp[0][j],dp[0][j-1]);}//状态转移if(m==1) return dp[0][n-1];if(n==1) return dp[m-1][0];for(int i=1;i<m;i++){for(int j=1;j<n;j++){if(text1[i]==text2[j]) 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-1][n-1];}
};
5.编辑距离
这个也能动态规划吗。。有点意思 我决定手撕一下。撕不了,完全不会。
必须尝试理解一下这个题,理解不了就先过拟合硬记。
有一个字符为空串的这个判断写的很简洁。
class Solution {
public:int minDistance(string word1, string word2) {int m=word1.size();int n=word2.size();vector<vector<int>>dp (m+1,vector<int>(n+1,INT_MAX));for(int i=0;i<m+1;i++) dp[i][0]=i;for(int i=0;i<n+1;i++) dp[0][i]=i;// 有一个字符串为空串if (n * m == 0) return n + m;for(int i=1;i<m+1;i++){for(int j=1;j<n+1;j++){int left=dp[i-1][j]+1;int down=dp[i][j-1]+1;int left_down=dp[i-1][j-1];if(word1[i-1]!=word2[j-1]) left_down++;dp[i][j]=min({left,down,left_down});}}return dp[m][n];}
};