第六周动态规划
53. 最大子序和
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.empty())return 0;
int n=nums.size();
vector<int> dp(n);
int maxval=nums[0];
dp[0]=nums[0];
for(int i=1;i<n;i++){
dp[i]=max(dp[i-1]+nums[i],nums[i]);
maxval=max(maxval,dp[i]);
}
return maxval;
}
};
198. 打家劫舍
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size()==1)return nums[0];
if(nums.size()==2)return max(nums[0],nums[1]);
int n=nums.size();
vector<int> dp(n);
dp[0]=nums[0];
int res=dp[0];
dp[1]=max(nums[1],dp[0]);
res=max(res,dp[1]);
for(int i=2;i<n;i++){
dp[i]=max(dp[i-2]+nums[i],dp[i-1]);
res=max(res,dp[i]);
}
return res;
}
};
322. 零钱兑换
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
if(amount==0)return 0;
vector<int> dp(amount+1,amount+1);
dp[0]=0;
for(int i=0;i<=amount;i++){
for(int j=0;j<coins.size();j++){
if(i-coins[j]<0)
continue;
dp[i]=min(dp[i],dp[i-coins[j]]+1);
}
}
return dp[amount]==amount+1?-1:dp[amount];
}
};
10. 正则表达式匹配
class Solution {
public:
bool isMatch(string s, string p) {
vector<vector<int>> a(s.size()+1,vector<int>(p.size()+1,0));
return dp(a,s,0,p,0);
}
bool dp(vector<vector<int>>& a,string& s,int i,string& p,int j){
if(j==p.size())return i==s.size();
if(a[i][j]==1)return true;
if(a[i][j]==-1)return false;
while(i<s.size()&&j<p.size()){
if(s[i]==p[j]||p[j]=='.'){
if(j+1<p.size()&&p[j+1]=='*'){
bool res=dp(a,s,i+1,p,j)||dp(a,s,i,p,j+2);
if(res)
a[i][j]=1;
else
a[i][j]=-1;
return res;
}
else{
i++;
j++;
}
}
else{
if(p[j+1]=='*')
j+=2;
else{
a[i][j]=-1;
return false;
}
}
}
while(i==s.size()&&j<p.size()-1&&p[j+1]=='*')
j+=2;
if(i==s.size()&&j==p.size()){
a[i][j]=1;
return true;
}
else{
a[i][j]=-1;
return false;
}
}
};