【道德经·第三十三章】知人者智,自知者明。胜人者有力,自胜者强。知足者富,强行者有志,不失其所者久,死而不亡者寿。
本文代码参考自:HReina的博客
只能交易一次
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public: int maxProfit(vector<int>& prices) { int n=prices.size(); vector<int> dp0(n); vector<int> dp1(n);
dp0[0]=0; dp1[0]=-prices[0];
for(int i=1;i<n;i++){ dp0[i]=max(dp0[i-1], dp1[i-1]+prices[i]); dp1[i]=max(dp1[i-1], -prices[i]); } return dp0[n-1]; } };
|
交易次数不限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public: int maxProfit(vector<int>& prices) { int n=prices.size(); vector<int> dp0(n); vector<int> dp1(n);
dp0[0]=0; dp1[0]=-prices[0];
for(int i=1;i<n;i++){ dp0[i]=max(dp0[i-1], dp1[i-1]+prices[i]); dp1[i]=max(dp1[i-1], dp0[i-1]-prices[i]); } return dp0[n-1]; } };
|
最多交易两次
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public: int maxProfit(vector<int>& prices) { int n=prices.size(); vector<vector<int>> dp0(n,vector<int>(3)); vector<vector<int>> dp1(n,vector<int>(3));
for(int i=1;i<=2;i++){ dp0[0][i]=0; dp1[0][i]=-prices[0]; }
for(int i=1;i<n;i++){ for(int j=2;j>0;j--){ dp0[i][j]=max(dp0[i-1][j], dp1[i-1][j]+prices[i]); dp1[i][j]=max(dp1[i-1][j], dp0[i-1][j-1]-prices[i]); } } return dp0[n-1][2]; } };
|
最多可以交易k次
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { public: int maxProfit(int k, vector<int>& prices) { int n=prices.size(); if(n==0) return 0; vector<vector<int>> dp0(n,vector<int>(k+1)); vector<vector<int>> dp1(n,vector<int>(k+1));
for(int i=1;i<=k;i++){ dp0[0][i]=0; dp1[0][i]=-prices[0]; }
for(int i=1;i<n;i++){ for(int j=k;j>0;j--){ dp0[i][j]=max(dp0[i-1][j], dp1[i-1][j]+prices[i]); dp1[i][j]=max(dp1[i-1][j], dp0[i-1][j-1]-prices[i]); } } return dp0[n-1][k]; } };
|
交易次数不限,含冷冻期
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution { public: int maxProfit(vector<int>& prices) { int n=prices.size(); if(n<=1) return 0; vector<int> dp0(n); vector<int> dp1(n); dp0[0]=0; dp1[0]=-prices[0]; dp0[1]=max(dp0[0], dp1[0]+prices[1]); dp1[1]=max(dp1[0], -prices[1]); for(int i=2;i<n;i++){ dp0[i]=max(dp0[i-1], dp1[i-1]+prices[i]); dp1[i]=max(dp1[i-1], dp0[i-2]-prices[i]); } return dp0[n-1]; } };
|
交易次数不限,含手续费
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public: int maxProfit(vector<int>& prices, int fee) { int n=prices.size(); vector<int> dp0(n); vector<int> dp1(n);
dp0[0]=0; dp1[0]=-prices[0]-fee;
for(int i=1;i<n;i++){ dp0[i]=max(dp0[i-1], dp1[i-1]+prices[i]); dp1[i]=max(dp1[i-1], dp0[i-1]-prices[i]-fee); } return dp0[n-1]; } };
|
位我上者,灿烂星空;道德律令,在我心中。