算法笔记—动态规划
1137. 第 N 个泰波那契数 - 力扣(LeetCode)
class Solution {
public:int tribonacci(int n) {if(n==0) return 0;if(n==1||n==2) return 1;vector<int> dp(4);//初始化dp[0]=0; dp[1]=1; dp[2]=1;for(int i=3;i<n+1;i++){//滚动数组优化需要循环dp[i%4]=dp[(i-1)%4]+dp[(i-2)%4]+dp[(i-3)%4];}return dp[n%4];}
};
面试题 08.01. 三步问题 - 力扣(LeetCode)
class Solution {
public:int waysToStep(int n) {const int MOD=1e9+7;if(n==1) return 1;if(n==2) return 2;if(n==3) return 4;int a=1; int b=2; int c=4; int d=0;for(int i=4;i<=n;i++){d=((a+b)%MOD+c)%MOD;a=b; b=c; c=d;}return d;}
};
746. 使用最小花费爬楼梯 - 力扣(LeetCode)
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n=cost.size();if(n<=1) return 0;vector<int> dp(n+1);dp[0]=0;dp[1]=0;for(int i=2;i<n+1;i++){dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);}return dp[n];}
};
91. 解码方法 - 力扣(LeetCode)
class Solution {
public:int numDecodings(string s) {int n=s.size();vector<int> dp(n,0);dp[0]=s[0]!='0';if(n==1) return dp[0];//初始化下标1if('0'<s[1]&&s[1]<='9') dp[1]+=dp[0];int a=s[0]-'0'; int b=s[1]-'0';if(10<=a*10+b&&a*10+b<=26) dp[1]++;for(int i=2;i<n;i++){if('0'<s[i]&&s[i]<='9') dp[i]+=dp[i-1];int c=s[i-1]-'0'; int d=s[i]-'0';if(10<=c*10+d&&c*10+d<=26&&dp[i-2]) dp[i]+=dp[i-2];}for(int &val:dp){cout<<val<<endl;}return dp[n-1];}
};
62. 不同路径 - 力扣(LeetCode)
class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m+1,vector<int>(n+1,0)); dp[1][0]=1;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][n];}
};
63. 不同路径 II - 力扣(LeetCode)
class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m=obstacleGrid.size(); int n=obstacleGrid[0].size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));dp[1][0]=1;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(obstacleGrid[i-1][j-1]!=1)dp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m][n];}
};
LCR 166. 珠宝的最高价值 - 力扣(LeetCode)
class Solution {
public:int jewelleryValue(vector<vector<int>>& frame) {int m=frame.size(); int n=frame[0].size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){dp[i][j]=max(dp[i-1][j],dp[i][j-1])+frame[i-1][j-1];}}return dp[m][n];}
};
931. 下降路径最小和 - 力扣(LeetCode)
class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {//建表int m=matrix.size(); int n=matrix[0].size();vector<vector<int>> dp(m+1,vector<int>(n+2,INT_MAX));//初始化for(int i=0;i<=n+1;i++){dp[0][i]=0;}//填表for(int i=1;i<=m;i++){for(int j=1;j<n+1;j++){dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i-1][j+1]))+matrix[i-1][j-1];//***1***注意dp的下标和数据数组的下标对应起来,**2**初始化要满足依靠初始的状态填表正确}}int ret=INT_MAX;for(int i=1;i<n+1;i++){ret=min(dp[m][i],ret);}return ret;}
};
64. 最小路径和 - 力扣(LeetCode)
class Solution {
public:int minPathSum(vector<vector<int>>& grid) {//建表int m=grid.size(); int n=grid[0].size();vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));//初始化dp[0][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-1][j-1];}}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){cout<<dp[i][j]<<" ";}cout<<endl;}return dp[m][n];}
};
174. 地下城游戏 - 力扣(LeetCode)
class Solution {
public:int calculateMinimumHP(vector<vector<int>>& dungeon) {int m=dungeon.size(); int n=dungeon[0].size();vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));dp[m][n-1]=1;//依题意是 1,不是0;for(int i=m-1;i>=0;i--){for(int j=n-1;j>=0;j--){dp[i][j]=min(dp[i+1][j],dp[i][j+1])-dungeon[i][j];dp[i][j]=dp[i][j]<1?1:dp[i][j];//状态表示:骑士的血无法小于1}}return dp[0][0]<1?1:dp[0][0];}
};
面试题 17.16. 按摩师 - 力扣(LeetCode)
class Solution {
public:int massage(vector<int>& nums) {int n=nums.size();if(n==0) return 0;vector<int> f(n);vector<int> g(n);f[0]=nums[0];for(int i=1;i<n;i++){g[i]=max(f[i-1],g[i-1]);f[i]=g[i-1]+nums[i];// cout<<g[i]<<" "<<f[i]<<endl;}return g[n-1]>f[n-1]?g[n-1]:f[n-1];}
};
213. 打家劫舍 II - 力扣(LeetCode)
class Solution {
public:int rob(vector<int>& nums) {int n=nums.size();return max(nums[0]+rob_1(nums,2,n-2),rob_1(nums,1,n-1));}int rob_1(vector<int>& nums,int left,int right){if(left>right) return 0;//**1**数据不满足范围,那么需要返回0int n=nums.size();vector<int> f(n);vector<int> g(n);f[left]=nums[left];for(int i=left+1;i<=right;i++){g[i]=max(g[i-1],f[i-1]);f[i]=g[i-1]+nums[i];}return g[right]>f[right]?g[right]:f[right];}
};
740. 删除并获得点数 - 力扣(LeetCode)
class Solution {
public:int deleteAndEarn(vector<int>& nums) {int hash[10001]={0};for(int &val:nums){hash[val]+=val;}int f[10001];int g[10001];f[0]=hash[0];for(int i=1;i<10001;i++){g[i]=max(g[i-1],f[i-1]);f[i]=g[i-1]+hash[i];}return g[10000]>f[10000]?g[10000]:f[10000];}
};
LCR 091. 粉刷房子 - 力扣(LeetCode)
class Solution {
public:int minCost(vector<vector<int>>& costs) {int m=costs.size(); int n=costs[0].size();vector<vector<int>> dp(m+1,vector<int>(3,0));for(int i=1;i<=m;i++){dp[i][0]=min(dp[i-1][1],dp[i-1][2])+costs[i-1][0];//***1***初始化要满足递推为正确dp[i][1]=min(dp[i-1][0],dp[i-1][2])+costs[i-1][1];//***2***下标要映射正确dp[i][2]=min(dp[i-1][1],dp[i-1][0])+costs[i-1][2];}int ret=INT_MAX;for(int i=0;i<3;i++){ret=min(ret,dp[m][i]);}return ret;}
};
714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode)
class Solution {
public:int maxProfit(vector<int>& prices, int fee) {const int n=prices.size();int f[n]; int g[n];f[0]=-prices[0]; g[0]=0;for(int i=1;i<n;i++){f[i]=max(g[i-1]-prices[i],f[i-1]);g[i]=max(f[i-1]+prices[i]-fee,g[i-1]);}return g[n-1]; }
};
123. 买卖股票的最佳时机 III - 力扣(LeetCode)
class Solution {
public:int maxProfit(vector<int>& prices) {int n=prices.size();int INF=0x3f3f3f3f;vector<vector<int>> f(n,vector<int>(3,-INF));vector<vector<int>> g(n,vector<int>(3,-INF));f[0][0]=-prices[0]; g[0][0]=0;//g[0][0],j=0表示初始状态处于无股票状态,没有买入和卖出,f[0][0];j=0表示第一次买入for(int i=1;i<n;i++){for(int j=0;j<3;j++){f[i][j]=max(f[i-1][j],g[i-1][j]-prices[i]);g[i][j]=g[i-1][j];if(j-1>=0)g[i][j]=max(g[i-1][j],f[i][j-1]+prices[i]);}}int ret=0;for(int i=0;i<3;i++){ret=max(ret,g[n-1][i]);}return ret;}
};
188. 买卖股票的最佳时机 IV - 力扣(LeetCode)
class Solution {
public:int maxProfit(int k, vector<int>& prices) {int n=prices.size();int INF=0x3f3f3f3f;//优化;k=min(k,n/2);//最多交易n/2次vector<vector<int>> f(n,vector<int>(k+1,-INF));vector<vector<int>> g(n,vector<int>(k+1,-INF));f[0][0]=-prices[0]; g[0][0]=0;for(int i=1;i<n;i++){//***2***从第2天开始for(int j=0;j<k+1;j++){f[i][j]=max(f[i-1][j],g[i-1][j]-prices[i]);g[i][j]=g[i-1][j];if(j-1>=0)g[i][j]=max(g[i-1][j],f[i-1][j-1]+prices[i]);}}int ret=0;for(int i=0;i<k+1;i++){ret=max(ret,g[n-1][i]);}return ret;}
};
53. 最大子数组和 - 力扣(LeetCode)
class Solution {
public:int maxSubArray(vector<int>& nums) {int n=nums.size();//建表vector<int> dp(n+1,0);const int INF=0x3f3f3f3f;int ret=-INF;for(int i=1;i<=n;i++){dp[i]=max(nums[i-1],dp[i-1]+nums[i-1]);ret=max(ret,dp[i]);}return ret;}
};
918. 环形子数组的最大和 - 力扣(LeetCode)
class Solution {
public:int maxSubarraySumCircular(vector<int>& nums) {int n=nums.size();vector<int> f(n+1);vector<int> g(n+1);int fmax=INT_MIN; int gmin=INT_MAX; int sum=0;//用来标记全为负数的情况for(int i=1;i<=n;i++){int x=nums[i-1];f[i]=max(f[i-1]+nums[i-1],nums[i-1]);fmax=max(fmax,f[i]);g[i]=min(g[i-1]+nums[i-1],nums[i-1]);gmin=min(gmin,g[i]);sum+=x;}return sum==gmin?fmax:max(fmax,sum-gmin);}
};
152. 乘积最大子数组 - 力扣(LeetCode)
class Solution {
public:int maxProduct(vector<int>& nums) {int n=nums.size();vector<int> f(n+1);vector<int> g(n+1);//**1**初始化f[0]=1; g[0]=1;int ret=INT_MIN;for(int i=1;i<=n;i++){f[i]=max(nums[i-1],max(f[i-1]*nums[i-1],g[i-1]*nums[i-1]));g[i]=min(nums[i-1],min(f[i-1]*nums[i-1],g[i-1]*nums[i-1]));ret=max(ret,f[i]); }return ret;}
};
1567. 乘积为正数的最长子数组长度 - 力扣(LeetCode)
class Solution {
public:int getMaxLen(vector<int>& nums) {int n=nums.size();vector<int> f(n+1);vector<int> g(n+1);int ret=INT_MIN;for(int i=1;i<n+1;i++){if(nums[i-1]==0){//**3**比较符号不要写成=f[i]=0; g[i]=0;}else if(nums[i-1]<0){f[i]=g[i-1]==0?0:g[i-1]+1;//**1**注意逻辑关系:负数*负数=正数g[i]=f[i-1]+1;//正数*负数=负数}else if(nums[i-1]>0){f[i]=f[i-1]+1;g[i]=g[i-1]==0?0:g[i-1]+1;}cout<<f[i]<<" "<<g[i]<<endl;ret=max(ret,f[i]);}return ret;}
};
413. 等差数列划分 - 力扣(LeetCode)
class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n=nums.size();vector<int> dp(n);int sum=0;for(int i=2;i<n;i++){dp[i]=nums[i]+nums[i-2]==2*nums[i-1]?dp[i-1]+1:0;sum+=dp[i];}return sum;}
};
978. 最长湍流子数组 - 力扣(LeetCode)
class Solution {
public:int maxTurbulenceSize(vector<int>& arr) {int n=arr.size();vector<int> f(n,1);vector<int> g(n,1);int ret=1;for(int i=1;i<n;i++){if(arr[i]>arr[i-1]){f[i]=g[i-1]+1;}else if(arr[i]<arr[i-1]){g[i]=f[i-1]+1;}ret=max(ret,max(g[i],f[i]));}return ret;}
};
139. 单词拆分 - 力扣(LeetCode)
class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> hash;for(int i=0;i<wordDict.size();i++){hash.insert(wordDict[i]);}int n=s.size();vector<bool> dp(n+1,false);dp[0]=true;for(int i=1;i<n+1;i++){for(int j=0;j<i;j++){// cout<<s.substr(j,i-j)<<" ";//**1**对应首位下标改变,长度不变。if(dp[j]&&hash.count(s.substr(j,i-j)))dp[i]=true;cout<<endl;}}return dp[n];}
};
467. 环绕字符串中唯一的子字符串 - 力扣(LeetCode)
class Solution {
public:int findSubstringInWraproundString(string s) {int n=s.size();vector<int> dp(n,1);for(int i=1;i<n;i++)if(s[i]==s[i-1]+1||(s[i]=='a'&&s[i-1]=='z'))dp[i]=dp[i-1]+1;int hash[26];for(int i=0;i<n;i++){hash[s[i]-'a']=max(hash[s[i]-'a'],dp[i]);}int sum=0;for(int i=0;i<26;i++){sum+=hash[i];}return sum;}
};
300. 最长递增子序列 - 力扣(LeetCode)
class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n=nums.size();vector<int> dp(n,1);int ret=1;for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(nums[i]>nums[j])dp[i]=max(dp[i],dp[j]+1);}ret=max(ret,dp[i]);}return ret;}
};
376. 摆动序列 - 力扣(LeetCode)
class Solution {
public:int wiggleMaxLength(vector<int>& nums) {int n=nums.size();vector<int> g(n,1);vector<int> f(n,1);int ret=1;for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(nums[i]>nums[j]) f[i]=max(g[j]+1,f[i]);if(nums[i]<nums[j]) g[i]=max(f[j]+1,g[i]);}ret=max(ret,max(g[i],f[i]));}return ret;}
};
673. 最长递增子序列的个数 - 力扣(LeetCode)
class Solution {
public:int findNumberOfLIS(vector<int>& nums) {int n=nums.size();vector<int> len(n,1),count(n,1);int retlen=1; int retcount=1;for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(nums[i]>nums[j]){if(len[j]+1==len[i]){count[i]+=count[j];}else if(len[j]+1>len[i]){len[i]=len[j]+1;count[i]=count[j];}}}if(retlen<len[i]){retlen=len[i]; retcount=count[i];}else if(retlen==len[i]){retcount+=count[i];}}return retcount;}
};
646. 最长数对链 - 力扣(LeetCode)
class Solution {
public:int findLongestChain(vector<vector<int>>& pairs) {sort(pairs.begin(),pairs.end(),[](vector<int> a,vector<int> b){return a[0]<b[0]||(a[0]==b[0]&&a[1]<b[1]);});int n=pairs.size();int ret=1;vector<int> dp1(n,1);for(int i=1;i<n;i++){for(int j=0;j<i;j++){if(pairs[i][0]>pairs[j][1]) dp1[i]=dp1[j]+1;}ret=max(dp1[i],ret);}return ret;}
};
1218. 最长定差子序列 - 力扣(LeetCode)
class Solution {
public:int longestSubsequence(vector<int>& arr, int difference) {int n=arr.size();unordered_map<int,int> hash;hash[arr[0]]=1;int ret=1;for(int i=1;i<n;i++){hash[arr[i]]=hash[arr[i]-difference]+1;//**1**等差数组没有前缀,也要插入hash表中ret=max(ret,hash[arr[i]]); }return ret;}
};
873. 最长的斐波那契子序列的长度 - 力扣(LeetCode)
class Solution {
public:int lenLongestFibSubseq(vector<int>& arr) {int n=arr.size();unordered_map<int,int> hash;for(int i=0;i<n;i++){hash[arr[i]]=i;}vector<vector<int>> dp(n,vector<int>(n,2));int ret=2;for(int i=2;i<n;i++){for(int j=1;j<i;j++){int a=arr[i]-arr[j];if(a<arr[j]&&hash.count(a)){dp[j][i]=dp[hash[a]][j]+1;}ret=max(ret,dp[j][i]);}}return ret<3?0:ret;}
};
1027. 最长等差数列 - 力扣(LeetCode)
class Solution {
public:int longestArithSeqLength(vector<int>& nums) {int n=nums.size();unordered_map<int,int> hash;// hash[nums[0]]=0; hash[nums[1]]=1;hash[nums[0]]=0;vector<vector<int>> dp(n,vector<int>(n,2));int ret=2;//任意两个数都可以构成等差数列for(int j=1;j<n;j++){for(int i=j+1;i<n;i++){int a=2*nums[j]-nums[i];//a可能有多个值,我们必须找到最右端的值,才是最大的,if(hash.count(a)){dp[j][i]=dp[hash[a]][j]+1;} ret=max(dp[j][i],ret); // cout<<dp[j][i]<<" ";}hash[nums[j]]=j;// cout<<endl;}return ret;}
};
446. 等差数列划分 II - 子序列 - 力扣(LeetCode)
class Solution {
public:int numberOfArithmeticSlices(vector<int>& nums) {int n=nums.size();unordered_map<long long,vector<int>> hash;//**2** long long因为推导等差数组前的值需要2*nums[j].vector<vector<int>> dp(n,vector<int>(n,0));for(int i=0;i<n;i++){hash[nums[i]].push_back(i);}int sum=0;for(int i=2;i<n;i++){for(int j=1;j<i;j++){long long a=(long long)2*nums[j]-nums[i];if(hash.count(a)){//***1**必须要先寻找,hash[a],相当于插入了for(int k:hash[a]){if(k<j) dp[j][i]+=dp[k][j]+1;else break;cout<<k<<" ";}}sum+=dp[j][i];}}return sum;}
};
647. 回文子串 - 力扣(LeetCode)
class Solution {
public:int countSubstrings(string s) {int n=s.size();vector<vector<bool>> dp(n,vector<bool>(n,false));int ret=0;for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s[i]==s[j]){dp[i][j]=i+1<j?dp[i+1][j-1]:true; }else{dp[i][j]=false;}if(dp[i][j]==true) ret++;}}return }
};
5. 最长回文子串 - 力扣(LeetCode)
class Solution {
public:string longestPalindrome(string s) {int n=s.size();vector<vector<bool>> dp(n,vector<bool>(n,0));int len=0; int begin=0;for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s[i]==s[j]){dp[i][j]=i+1<j?dp[i+1][j-1]:true;}if(dp[i][j]==true&&j-i+1>len){len=j-i+1; begin=i;}}}return s.substr(begin,len);}
};
1745. 分割回文串 IV - 力扣(LeetCode)
class Solution {
public:bool checkPartitioning(string s) {int n=s.size();vector<vector<bool>> dp(n,vector<bool>(n,false));for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s[i]==s[j]){dp[i][j]=i+1<j?dp[i+1][j-1]:true;}}}for(int j=1;j<n;j++){for(int i=j+1;i<n;i++){if(dp[0][j-1]&&dp[j][i-1]&&dp[i][n-1]) return true;}}return false;}
};
132. 分割回文串 II - 力扣(LeetCode)
class Solution {
public:int minCut(string s) {int n=s.size();vector<vector<bool>> dp(n,vector<bool>(n,false));for(int i=n-1;i>=0;i--){for(int j=i;j<n;j++){if(s[i]==s[j])dp[i][j]=i+1<j ? dp[i+1][j-1]:true;}}int ret=INT_MAX;vector<int> dp1(n,INT_MAX);for(int i=0;i<n;i++){if(dp[0][i]) dp1[i]=0;else{for(int j=0;j<i;j++){if(dp[j+1][i]) dp1[i]=min(dp1[j]+1,dp1[i]);}}}return dp1[n-1];//**根据状态表示返回}
};
516. 最长回文子序列 - 力扣(LeetCode)
class Solution {
public:int longestPalindromeSubseq(string s) {int n=s.size();vector<vector<int>> dp(n,vector<int>(n,0));for(int i=n-1;i>=0;i--){dp[i][i]=1;for(int j=i+1;j<n;j++){if(s[i]==s[j])dp[i][j]=dp[i+1][j-1]+2;//i+1=j时dp[i+1][j-1]=0,不变else dp[i][j]=max(dp[i+1][j],dp[i][j-1]);}}return dp[0][n-1];}
};
1312. 让字符串成为回文串的最少插入次数 - 力扣(LeetCode)
class Solution {
public:int minInsertions(string s) {int n=s.size();vector<vector<int>> dp(n,vector<int>(n,0));for(int i=n-1;i>=0;i--){for(int j=i+1;j<n;j++){if(s[i]==s[j]) dp[i][j]=dp[i+1][j-1];else dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1);}}return dp[0][n-1];}
};
1143. 最长公共子序列 - 力扣(LeetCode)
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int m=text1.size(); int n=text2.size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));string s1=" "+text1; string s2=" "+text2;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(s1[i]==s2[j]) dp[i][j]=dp[i-1][j-1]+1;else dp[i][j]=max(dp[i][j-1],dp[i-1][j]);}}return dp[m][n];}
};
1035. 不相交的线 - 力扣(LeetCode)
class Solution {
public:int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {int m=nums1.size(); int n=nums2.size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));for(int i=1;i<m+1;i++){for(int j=1;j<n+1;j++){if(nums1[i-1]==nums2[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];}
};
115. 不同的子序列 - 力扣(LeetCode)
class Solution {
public:int numDistinct(string s, string t) {int ret=0;int m=s.size(); int n=t.size();int MOD=1e9+7;vector<vector<double>> dp(m+1,vector<double>(n+1,0));for(int j=0;j<=m;j++) dp[j][0]=1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){dp[j][i]+=dp[j-1][i];if(s[j-1]==t[i-1]) {//**2**写成是s[j-1]==t[i-1]// cout<<endl<<"j,i "<<j<<" "<<i<<" "<<"s[j-1]"<<s[j-1]<<" s[i-1]"<<s[i-1]<<endl;dp[j][i]+=dp[j-1][i-1];//**1**:+=不是=。}// cout<<dp[j][i]<<" ";}// cout<<endl<<"_____________";}return dp[m][n];}
};
44. 通配符匹配 - 力扣(LeetCode)
class Solution {
public:bool isMatch(string s, string p) {int n=s.size(); int m=p.size();vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));s=' '+s; p=' '+p;dp[0][0]=true;for(int i=1;i<=m;i++){if(p[i]=='*')dp[i][0]=true;else break;}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(p[i]=='*') dp[i][j]=dp[i-1][j]+dp[i][j-1];//**1**状态转移方程写成dp[i-1][j-1]+dp[i][j-1]else if(p[i]=='?'||p[i]==s[j]) dp[i][j]=dp[i-1][j-1];}}return dp[m][n];}
};
10. 正则表达式匹配 - 力扣(LeetCode)
class Solution {
public:bool isMatch(string s, string p) {int m=s.size(); int n=p.size();vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));//**1**记得扩表s=' '+s; p=' '+p;dp[0][0]=true;for(int i=2;i<=n;i+=2) //初始化,结合题意,匹配空串,所以i=1,3,5,7,时,且i=奇数,这个奇数之前都是可以匹配的,也就是*,所以根据*之前必须匹配有效字符串所以必须是'.'或者a~zif(p[i]=='*') dp[0][i]=true;else break;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(p[j]=='*') dp[i][j]=dp[i][j-2]||((p[j-1]=='.'||s[i]==p[j-1])&&dp[i-1][j]);else dp[i][j]=(p[j]==s[i]||p[j]=='.')&&dp[i-1][j-1];}}return dp[m][n];}
};
97. 交错字符串 - 力扣(LeetCode)
class Solution {
public:bool isInterleave(string s1, string s2, string s3) {int m=s1.size(); int n=s2.size(); if(m+n!=s3.size()) return false;s1=' '+s1; s2=' '+s2; s3=' '+s3;//优化,滚动数组vector<bool> dp(n+1,false);dp[0]=true;for(int i=1;i<=n;i++){if(s2[i]==s3[i])dp[i]=true;else break; }for(int i=1;i<=m;i++){for(int j=0;j<=n;j++){if(j==0){dp[j]=s1[i]==s3[i+j]&&dp[j];}elsedp[j]=(s1[i]==s3[i+j]&&dp[j])||(s2[j]==s3[i+j]&&dp[j-1]);}}return dp[n];//normal// vector<vector<bool>> dp(m+1,vector<bool>(n+1,false));// dp[0][0]=true;// for(int i=1;i<=m;i++){// if(s1[i]==s3[i])// dp[i][0]=true;// else break; // }// for(int j=1;j<=n;j++){// if(s2[j]==s3[j])// dp[0][j]=true; // else break; // }// for(int i=1;i<=m;i++){// for(int j=1;j<=n;j++){// dp[i][j]=((s1[i]==s3[i+j])&&dp[i-1][j])||((s2[j]==s3[i+j])&&dp[i][j-1]);// }// }// return dp[m][n];}
};
712. 两个字符串的最小ASCII删除和 - 力扣(LeetCode)
class Solution {
public:int minimumDeleteSum(string s1, string s2) {int m=s1.size(); int n=s2.size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){dp[i][j]=max(dp[i-1][j],dp[i][j-1]);if(s1[i-1]==s2[j-1]){dp[i][j]=max(dp[i][j],dp[i-1][j-1]+s1[i-1]);}}}int sum=0;for(int val:s1) sum+=val;for(int val:s2) sum+=val;return sum-dp[m][n]-dp[m][n];}
};
718. 最长重复子数组 - 力扣(LeetCode)
class Solution {
public:int findLength(vector<int>& nums1, vector<int>& nums2) {int m=nums1.size(); int n=nums2.size();vector<vector<int>> dp(m+1,vector<int>(n+1,0));int ret=0;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(nums1[i-1]==nums2[j-1])dp[i][j]=dp[i-1][j-1]+1; ret=max(ret,dp[i][j]); }}return ret;}
};
相关文章:
算法笔记—动态规划
1137. 第 N 个泰波那契数 - 力扣(LeetCode) class Solution { public:int tribonacci(int n) {if(n0) return 0;if(n1||n2) return 1;vector<int> dp(4);//初始化dp[0]0; dp[1]1; dp[2]1;for(int i3;i<n1;i){//滚动数组优化需要循环dp[i%4]dp[…...
Vue3集成Element Plus完整指南:从安装到主题定制上
一、Element Plus简介 Element Plus是一套基于Vue 3.0的桌面端组件库,由饿了么前端团队开源维护。它提供了丰富的UI组件,能够帮助开发者快速构建企业级中后台产品。 1. 安装与卸载 bash 复制 下载 # 安装最新版本 npm install element-plus -S# 卸…...
初识javascript
1. JavaScript 基础语法 (1) 变量声明 JavaScript支持三种声明变量的方式: var:传统的变量声明方式,存在作用域问题(函数作用域)。 let:块级作用域变量声明方式,避免了var的作用域问题。 co…...
C++项目 —— 基于多设计模式下的同步异步日志系统(5)(单例模式)
C项目 —— 基于多设计模式下的同步&异步日志系统(5)(单例模式) 一个问题单例模式实现1. 单例模式:全局唯一实例功能:实现细节:作用: 2. 日志器的注册与查找功能:实现…...
rag搭建,是如何进行向量匹配检索的?
RAG 里为什么要“向量检索”? 在 Retrieval-Augmented Generation (RAG) 中,我们的目标是让 LLM 能够“回答它本身不知道的内容”。做法是: 将知识(文本)进行向量化,存入向量数据库;用户提问后,也将问题向量化;去数据库里 找出与这个问题最相似的一批知识,返回喂给 …...
k8s 基础入门篇之开启 firewalld
前面在部署k8s时,都是直接关闭的防火墙。由于生产环境需要开启防火墙,只能放行一些特定的端口, 简单记录一下过程。 1. firewall 与 iptables 的关系 1.1 防火墙(Firewall) 定义: 防火墙是网络安全系统&…...
C++在VR/AR图形处理开发中的实战应用
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
Matlab 基于模型参考自适应法和SVPWM的异步电机控制
1、内容简介 Matlab 212-基于模型参考自适应法和SVPWM的异步电机控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
深入浅出讲解UDP检验中如何计算检验和
一、计算机中的进制:二进制与十六进制 1. 十进制(Decimal) 特点:用0-9表示,逢10进1。 例子:数字 123 表示 110221013100110221013100。 2. 二进制(Binary) 特点:用0和…...
Python类和对象一(十)
封装: 在创建对象之前,通过类将相关的属性和方法打包到一起,然后通过类来生成响应的对象 定义类: 创建对象: 方法里面有个参数self:new的对象 当我们调用类里面方法的时候,py是怎么知道是哪…...
jupyter切换存储路径
一、问题描述 当我采用官网提供的安装方式pip install jupyterlab,在Windows下的powershell里安装jupyterlab成功,并启动:jupyter lab 打开网页:http://localhost:8888/lab 显示如下:成功了,可是我发现这…...
PH热榜 | 2025-04-20
1. Checklist GG 标语:基于人工智能的清单管理工具 介绍:checklist.gg 是一款基于人工智能的检查清单管理工具,旨在帮助组织确保每次都能准确完成任务。 产品网站: 立即访问 Product Hunt: View on Product Hunt 关…...
YOLOv11改进——基于注意力机制和密集小目标增强型EVA模块的设计与实现
随着计算机视觉技术的快速发展,目标检测算法在实时性与检测精度间的平衡成为研究重点。YOLO(You Only Look Once)系列算法以其高效性和准确性,长期占据实时目标检测领域的前沿位置。然而,尽管最新版本在通用场景表现优…...
n8n 中文系列教程_04.半开放节点深度解析:Code与HTTP Request高阶用法指南
在低代码开发领域,n8n凭借其独特的半开放架构打破了传统自动化工具的边界。本文深度剖析两大核心节点——Code与HTTP Request,从底层原理到企业级实战,揭秘如何通过代码自由扩展与API无缝集成,突破平台限制。无论是对接国产生态&a…...
Linux学习——了解和熟悉Linux系统的远程终端登录
Linux学习——了解和熟悉Linux系统的远程终端登录 一.配置Ubuntu系统的网络和用户 1、设置虚拟机网络为桥接模式 打开VMWare,选择编辑虚拟机设置,在网络适配器设置中,选择“桥接模式”,保存设置并启动Ubuntu。 2、配置Ubuntu的…...
PFLM: Privacy-preserving federated learning with membership proof证明阅读
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…...
十倍开发效率 - IDEA插件之 Maven Helper
0X00 先看效果 第一个选项表示存在冲突的依赖,可以看到图片中 mysql 的连接依赖发生了冲突,在低版本的上面直接右键选择 Exclude,冲突的依赖就被解决掉了。 0X01 安装 在 Plugins 中直接搜索 Maven Helper,选择第一个进行安装&am…...
线程安全总结
1.线程安全 1.1什么是线程安全 线程安全问题指的是当多个线程同时访问和操作共享资源(如变量、数据结构等)时,由于缺乏有效的同步控制,导致程序出现不可预期的错误或数据不一致的现象。其核心在于并发操作破坏了程序的正确性。 …...
计算机视觉cv入门之答题卡自动批阅
前边我们已经讲解了使用cv2进行图像预处理与边缘检测等方面的知识,这里我们以答题卡自动批阅这一案例来实操一下。 大致思路 答题卡自动批阅的大致流程可以分为这五步:图像预处理-寻找考试信息区域与涂卡区域-考生信息区域OCR识别-涂卡区域填涂答案判断…...
10.QT-显示类控件|LCD Number|ProgressBar|Calendar Widget(C++)
LCD Number QLCDNumer 是⼀个专⻔⽤来显⽰数字的控件.类似于"⽼式计算器"的效果 属性说明intValueQLCDNumber 显⽰的数字值(int).valueQLCDNumber 显⽰的数字值(double).和intValue是联动的.例如给value设为1.5,intValue的值就是2.另外,设置value和intValue的⽅法名…...
深入探索 Unix 与 Linux:历史、内核及发行版
引言 在当今的计算世界中,Unix 和 Linux 操作系统的影响力无处不在。从驱动互联网的服务器到我们口袋里的智能手机,再到无数嵌入式设备,它们的身影随处可见 1。这两个操作系统家族共享着丰富的历史和相似的设计哲学,但又各自走过…...
HCIP第三次作业
一、实验要求 1,R5为ISP,其上只能配置IP地址;R4作为企业边界路由器, 出口公网地址需要通过PPP协议获取,并进行chap认证 2整个0SPF环境IP基于172.16.0.0/16划分; 3所有设备均可访问R5的环回; 4减少LSA的更新量,加快收敛…...
Linux 入门:基础开发工具(下)git,cgdb操作指南
目录 一.进度条 一).补充:回车与换行 二).行缓冲区 三).进度条代码 二.版本控制器Git 一).Git 安装与配置 二).创建仓库 三).开始操作 1.简单流程 2.配置公钥 1).身份…...
【上位机——MFC】消息映射机制
消息映射机制 Window消息分类消息映射机制的使用代码示例 MFC框架利用消息映射机制把消息、命令与它们的处理函数映射起来。具体实现方法是在每个能接收和处理消息的类中,定义一个消息和消息函数指针对照表,即消息映射表。 在不重写WindowProc虚函数的大…...
提交bug单时,应该说明哪些信息?
在提交 Bug 单时,为了让开发人员能够快速定位和解决问题,需要详细说明以下几方面信息: Bug 的基本信息 标题:简洁明了地概括 Bug 的主要问题,例如 “登录页面输入错误密码后提示信息不准确”。Bug 类型:明确…...
max31865典型电路
PT100读取有很多种方案,常用的惠斯通电桥,和专用IC max31865 。 电阻温度检测器(RTD)是一种阻值随温度变化的电阻。铂是最常见、精度最高的测温金属丝材料。铂RTD称为PT-RTD,镍、铜和其它金属亦可用来制造RTD。RTD具有较宽的测温范围&#x…...
【网工第6版】第4章 无线通信网
目录 ■ 移动通信与4G 5G技术 ▲ 移动通信发展 ▲ 移动通信制式 ▲ 移动通信技术标准 ▲ 4G标准 ▲ 4G关键技术 ◎ OFDMA ◎ 4G关键技术-MIMO ◎ 4G关键技术-SDR ◎ 4G关键技术-VolP ▲ 5G应用场景 ▲ 5G两种组网模式 ▲ 5G关键技术 ■ CDMA计算 ■ WLAN通信技术…...
辅助函数构造题目(缓慢更新,遇到更道)
题1...
图论基础:图存+记忆化搜索
图的储存 储存图有很多种方式,在此介绍两种:邻接数组,邻接表 第一种虽然简单,但访问的时间和空间花销过大,因此第二种最为常见。 让我们分别看看它们是什么 在介绍之前,我们先解释一下此处说的“图”是什…...
使用docker任意系统编译opengauss
使用docker任意系统编译opengauss 本人使用开发机器为ubuntu系统,不在官方推荐的编译系统内。但是不想为了开发opengauss重装系统。所以采用docker进行编译。 代码拉取 本人是在/home/yuyang/Documents/opengauss目录下进行操作。 先获取源代码:git clone https:/…...
JavaScript 一维数组转二维数组
题目描述: <script>const num [1,2,3,4]const out (function(num,m,n){if(num.length ! m*n){return []}const newarr []for(let i 0;i<m;i){newarr.push(num.slice(i*n,(i1)*n))}return newarr})(num,2,2)console.log(out)</script>不使用Stri…...
C#进阶学习(八)常见的泛型数据结构类(3)SortedDictionary<TKey, TValue>与SortedList<TKey, TValue>
目录 关于默认的排序可以看这篇文章的第二点中关于排序的部分: 一、SortedDictionary 1. 核心特性 2. 常用方法和属性 二、SortedList 1. 核心特性 2. 常用方法和属性 三、关于TryGetValue(TKey key, out TValue value) 方法的详细说明 (一&…...
运维侠职场日记9:用DeepSeek三天通关详解自动化操作pdf批量提取PDF文字将PDF转Word文档(附上脚本代码)
一. 痛点 运维侠小白想将pdf文档转换成word文档,但是,wps等等这些软件的转换功能都是要付费,开通会员,这该怎么办?听说python也有这个功能于是迫不及待想学… 学会基础,学习的乐趣一点点积累 基础学习成本低,掌握所需的技能要求也少,学会一两行代码,看着输出,心理慢…...
热门算法面试题第19天|Leetcode39. 组合总和40.组合总和II131.分割回文串
39. 组合总和 力扣题目链接(opens new window) 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 ta…...
IDEA连接达梦数据库
1. 参考在IDEA中连接达梦数据库:详细配置指南_idea连接达梦数据库-CSDN博客 . jdbc:dm://127.0.0.1:5236?schemaSALES...
React Router V7使用详解
1,安装 React Router是React生态系统中最流行的路由解决方案,它允许开发者在单页应用的不同页面之间进行切换,而不需要重新加载整个页面,React Router与React框架深度集成,使得开发者在单页面应用中进行页面切换时变得轻而易举。 作为官方推荐的路由解决方案,React Rou…...
国际数据加密算法(IDEA)详解
以下是修正后的准确版本,已解决原文中的术语、符号及技术细节问题: 国际数据加密算法(IDEA) IDEA是一种分组加密算法,由Xuejia Lai(来学嘉)和James Massey于1990年设计。IDEA使用128位密钥对64位明文分组进行加密,经过8轮迭代运算后生成64位密文分组。其安全性基于…...
2025年4月19日-米哈游春招笔试题-第三题
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 魔法网格变换术 问题描述 在魔法学院,卢小姐正在研究一种特殊的魔法网格变换术。这种魔法作用于一个 n n n...
基于STM32串口通信
基于STM32串口通信 一、串口简介 串口,也称为串行接口或串行通信接口(通常指COM接口),是一种采用串行通信方式的扩展接口。它实现了数据一位一位地顺序传送,具有通信线路简单、成本低但传送速度慢的特点。 只要一对传…...
即梦AI与可灵AI视频生成功能对比分分析
一、核心功能与特点对比 维度可灵AI(快手旗下)即梦AI(字节跳动旗下)视频生成能力✅ 支持最长3分钟视频生成(通过续写功能)✅ 1080p分辨率、30fps帧率✅ 物理模拟(流体运动、重力效果࿰…...
【任务调度】Quartz入门
Quartz 入门 代码仓库地址: GitHub:chenmeng-test-demos/demo8-task at master cmty256/chenmeng-test-demosGitee:demo8-task chenmeng/chenmeng-test-demos - 码云 - 开源中国 基本介绍 Quartz 是一个开源的作业调度框架,它完…...
【网络编程】从零开始彻底了解网络编程(二)
本篇博客给大家带来的是网络编程的知识点,. 🐎文章专栏: JavaEE初阶 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 要开心要快乐顺便进步 1. …...
常见浏览器 WebDriver 驱动下载
以下是常见浏览器 WebDriver 驱动的下载地址及注意事项,综合多个可靠来源整理而成: 一、Chrome 浏览器(ChromeDriver) 官方下载地址 http://chromedriver.storage.googleapis.com/index.html • • 版本匹配:需与 Chro…...
【每日八股】复习计算机网络 Day3:TCP 协议的其他相关问题
文章目录 昨日内容复习TCP 的四次挥手?TCP 为什么要四次挥手?在客户端处于 FIN_WAIT_2 状态时,如果此时收到了乱序的来自服务端的 FIN 报文,客户端会如何处理?何时进入 TIME_WAIT 状态?TCP 四次挥手丢了怎么…...
大模型在胆管结石(无胆管炎或胆囊炎)预测及治疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 国内外研究现状 二、胆管结石相关理论基础 2.1 胆管结石概述 2.2 临床表现与诊断方法 2.3 传统治疗方法 三、大模型技术原理与应用优势 3.1 大模型基本原理 3.2 在医疗领域的应用潜力 3.3 用于胆管结石预测的可…...
LeetCode第159题_至多包含两个不同字符的最长子串
LeetCode 第159题:至多包含两个不同字符的最长子串 题目描述 给定一个字符串 s,找出 至多 包含两个不同字符的最长子串 t,并返回该子串的长度。 难度 中等 题目链接 点击在LeetCode中查看题目 示例 示例 1: 输入: s &qu…...
PG CTE 递归 SQL 翻译为 达梦版本
文章目录 PG SQLDM SQL总结 PG SQL with recursive result as (select res_id,phy_res_code,res_name from tbl_res where parent_res_id (select res_id from tbl_res where phy_res_code org96000#20211203155858) and res_type_id 1 union all select t1.res_id, t1.p…...
JavaScript 位掩码常量教程
JavaScript 位掩码常量教程 位掩码(Bitmask)是一种高效使用内存的技术,在JavaScript中可以用来存储和操作多个布尔值标志。下面我将为您介绍位掩码的基本概念、应用场景以及实践示例。 什么是位掩码常量? 位掩码利用二进制位&a…...
Linux守护进程
一、相关概念 QQ邮箱关于三种协议的解释:SMTP/IMAP服务 1.SMTP协议 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是一种用于发送电子邮件的互联网标准。它在TCP/IP协议族中,通常使用25端口进行通…...
Python多进程并发编程:深入理解Lock与Semaphore的实战应用与避坑指南
引言 在多进程并发编程中,资源竞争问题如同“隐形炸弹”,稍有不慎就会导致数据不一致或程序崩溃。无论是银行转账的余额错误,还是火车票超卖,其根源都在于共享资源的无序访问。如何安全高效地管理这些资源?Python中的锁…...