动态规划阶段总结

1、Maximum Subarray,最大连续子序列

class Solution {

public:

int maxSubArray(vector<int>& nums) {

int n=nums.size();

int dp[n]={0};

dp[0]=nums[0];

int maxum=nums[0];

for(int i=1;i<n;i++){

dp[i]=max(dp[i-1]+nums[i],nums[i]);

maxum=max(maxum,dp[i]);

}

return maxum;

}

};

 

2、Minimum Path Sum

Medium

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

Example:

Input: [   [1,3,1], [1,5,1], [4,2,1] ] Output: 7 Explanation: Because the path 1→3→1→1→1 minimizes the sum.

class Solution {

public:

int minPathSum(vector<vector<int>>& grid) {

int cow=grid[0].size();

int row=grid.size();

if(row==0) return 0;

int dp[row+1][cow+1];

memset(dp,0,sizeof(dp));

dp[0][0]=grid[0][0];

for(int i=1;i<row;i++){

dp[i][0]=grid[i][0]+dp[i-1][0];

}

for(int i=1;i<cow;i++){

dp[0][i]=grid[0][i]+dp[0][i-1];

}

for(int i=1;i<row;i++){

for(int j=1;j<cow;j++){

dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];

}

}

return dp[row-1][cow-1];

}

};

3、70. Climbing Stairs

class Solution {

public:

int climbStairs(int n) {

vector<int> nums(n+1,0);

return Mesh(n,nums);

}

int Mesh(int n,vector<int> &mesh){

if(n<3)

return mesh[n]=n;

else if(mesh[n]==0)

mesh[n]=Mesh(n-1,mesh)+Mesh(n-2,mesh);

return mesh[n];

}

};

4、Triangle

class Solution {

public:

int minimumTotal(vector<vector<int>>& triangle) {

int n=triangle.size();

int m=triangle[0].size();

// dp[n][m]={0};

vector<int> res(triangle[n-1]);

for(int i =n-2;i>=0;i--){

for(int j=0;j<triangle[i].size;j++){

res[j]=triangle[i][j]+min(res[j],res[j+1]);

}

}

return res[0];

}

};

 

5、股票买卖,只能买卖一次:以下代码没过,不知为何

class Solution {

public:

int maxProfit(vector<int>& prices) {

int n =prices.size();

int dp[n][2]={0}; //0买,1卖

dp[0][0]==prices[0];

dp[0][1]=0;

for(int i=1;i<n;i++){

dp[i][0]=min(prices[i],dp[i-1][0]);

dp[i][1]=max(dp[i-1][1],prices[i]-dp[i-1][0]);

}

return dp[n-1][1];

}

};

 

6、House Robber ,隔屋抢劫

class Solution {

public:

int rob(vector<int>& nums) {

int n =nums.size();

if(n==0) return 0;

if(n==1) return nums[0];

else if(n==2) return nums[1]>nums[0]?nums[1]:nums[0];

else {

vector<int> dp(n+1,0);

dp[0]=nums[0];

dp[1]=max(nums[0],nums[1]);

for(int i =2;i<n;i++){

dp[i]=max(dp[i-1],dp[i-2]+nums[i]);

}

return dp[n-1];

}

}

};

 

7、Coin Change 多少个零钱可以兑换

class Solution {

public:

int coinChange(vector<int>& coins, int amount) {

sort(coins.begin(),coins.end());

int n =coins.size();

vector<int> res(amount+1,INT_MAX);

res[0]=0;

for(int i=1;i<=amount;i++){

for(auto coin:coins){

if(coin<=i&&res[i-coin]!=INT_MAX){

res[i]=min(res[i],res[i-coin]+1);

}

}

}

return res[amount]==INT_MAX?-1:res[amount];

}

};

 

8、Combination sum4:

nums = [1, 2, 3] target = 4 The possible combination ways are: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1) Note that different sequences are counted as different combinations. Therefore the output is 7.

 

class Solution {

public:

int combinationSum4(vector<int>& nums, int target) {

vector<unsigned int> result(target + 1);

result[0] = 1;

for (int i = 1; i <= target; ++i) {

for (int x : nums) {

if (i >= x) {

result[i] += result[i - x];

}

}

}

return result[target];

}

};

9.Delect and Earn

* In each operation, you pick any nums[i] and delete it to earn nums[i]

* points. After, you must delete every element equal to nums[i] - 1 or nums[i]

* + 1.

 

 

class Solution {

public:

int deleteAndEarn(vector<int>& nums) {

if(nums.size()==0) return 0;

sort(nums.begin(),nums.end());

int n=nums[nums.size()-1];

vector<int> dp(n+1,0);

for(auto num:nums){

dp[num]+=num;

}

for(int i =3;i<=n;i++){

dp[i]=max(dp[i-2],dp[i-3])+dp[i];

}

return max(dp[n],dp[n-1]);

}

};

 

 

 

10、最长公共子序列:(连续)

class Solution {

public:

int findLength(vector<int>& A, vector<int>& B) {

int result=0;

vector<vector<int>> dp(A.size(),vector<int>(B.size(),0));

// dp[0][0]=A[0]==B[0]?1:0;

for(int i=0;i<A.size();i++){

for(int j=0;j<B.size();j++){

if(A[i]!=B[j]) dp[i][j]=0;

else{

if(i==0||j==0){

dp[i][j]=1;

}else

dp[i][j]=dp[i-1][j-1]+1;

}

if(dp[i][j]>result)

result=dp[i][j];

}

}

return result;

}

};

 

11、最长公共序列:(不连续)

for (int i = 0; i <= x.size(); i++) dp[i][0] = 0; for (int i = 0; i <= y.size(); i++) dp[0][i] = 0; for (int i = 1; i <= x.size(); i++) { for (int j = 1; j <= y.size(); j++) { if (x[i] == y[j]) { dp[i][j] = dp[i - 1][j - 1] + 1; } else { dp[i][j] = dp[i - 1][j] > dp[i][j - 1] ? dp[i - 1][j] : dp[i][j - 1]; } } }

 

12、最长回文串

 

 

class Solution {

public:

string longestPalindrome(string s) {

const int n=s.size();

bool dp[n][n];

fill_n(&dp[0][0],n*n,false);

int max_len=1; //保存最长回文子串长度

int start=0;//保存最长回文子串起点

for(int i=0;i<s.size();++i)

{

for(int j=0;j<=i;++j)

{

if(i-j<2)

dp[j][i]=(s[i]==s[j]);

else

dp[j][i]=(s[i]==s[j] && dp[j+1][i-1]);

if(dp[j][i] && max_len<(i-j+1))

{

max_len=i-j+1;

start=j;

}

}

}

return s.substr(start,max_len);

}

}

 

13.买卖股票含手续费

int main() {

// int F, N;

// cin >> F >> N;

// //int dp[NF][2];

// vector<int> res(N + 1, 0);

// for (int i = 0; i < N; i++) {

// cin >> res[i];

// }

// dp[0][0] = -res[0];

// dp[0][1] = 0;

// for (int i = 1; i < N; i++) {

// dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - res[i]);

// dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + res[i]-F);

// }

// cout << dp[N - 1][1] << endl;

// return 0;

//}

01背包

 

int knapsack01< const vector<int> &w,const vector<int> &v,int c)

{

if(!(w.size()==v.size()&&c>=0))

int n=w.size();

if(n==0||c==0)

return 0;

vector<int> memo(c+1,0);

for(int i=0;i<n;i++)

for(int j=c;j>=w[i];j--)

memo[j]=max(memo[j],v[i]+memo[j-w[i]]);

return memo[c];

}

 

 

完全背包

 

int knapsack01< const vector<int> &w,const vector<int> &v,int c)

{

if(!(w.size()==v.size()&&c>=0))

int n=w.size();

if(n==0||c==0)

return 0;

vector<int> memo(c+1,0);

for(int i=0;i<n;i++)

for(int j=w[i];j=<c;j++)

memo[j]=max(memo[j],v[i]+memo[j-w[i]]);

return memo[c];

}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值