DP33. 买卖股票的最好时机(四)
描述
输入描述
输出描述
输出最大收益示例1
输入:
6 3 8 9 3 5 1 3
输出:
5
说明:
示例2
输入:
8 2 3 2 5 0 0 3 1 4
输出:
7
说明:
示例3
输入:
4 4 9 8 4 1
输出:
0
C 解法, 执行用时: 3ms, 内存消耗: 336KB, 提交时间: 2022-06-20
#include <stdio.h> int max(int a, int b) { return a > b ? a : b; } int min(int a, int b) { return a > b ? b : a; } int main() { int n, k; scanf("%d %d", &n, &k); int *nums = (int *)malloc(sizeof(int) * n); int *dp = (int *)malloc(sizeof(int) * 2 * k); int *ndp = (int *)malloc(sizeof(int) * 2 * k); for (int i = 0; i < n; i++) { scanf("%d", &nums[i]); if (i == 0) { for (int j = 0; j < 2 * k; j+=2) { dp[j] = -nums[0]; } for (int j = 1; j < 2 * k; j+=2) { dp[j] = 0; } } else { for (int j = 0; j < 2 * k; j+=2) { ndp[j] = max(dp[j], (j == 0 ? 0 : dp[j-1])-nums[i]); } for (int j = 1; j < 2 * k; j+=2) { ndp[j] = max(dp[j], dp[j-1] + nums[i]); } for (int j = 0; j < 2 * k; j++) { dp[j] = ndp[j]; } } } int maxProfit = 0; for (int j = 1; j < 2 * k; j+=2) { if (dp[j] > maxProfit) { maxProfit = dp[j]; } } printf("%d", maxProfit); free(dp); free(ndp); free(nums); return 0; }
C 解法, 执行用时: 3ms, 内存消耗: 344KB, 提交时间: 2022-06-19
#include<stdio.h> int max(int i,int j){ if(i>j) return i; else return j; } int main(){ int n,k; scanf("%d%d",&n,&k);//n表示天数,k表示交易次数 int prices[n]; int dp1[k+1]; int dp2[k+1]; for(int i=0;i<n;i++){ scanf("%d",&prices[i]); } for(int i=0;i<=k;i++){ dp1[i]=0; dp2[i]=0; } for(int i=0;i<n;i++){ for(int j=1;j<=k;j++){ if(i==0){ dp1[j]=0; dp2[j]=-prices[i]; continue; } dp1[j] = max(dp1[j],dp2[j]+prices[i]); dp2[j] = max(dp2[j],dp1[j-1]-prices[i]); } } printf("%d",dp1[k]); return 0; }
C 解法, 执行用时: 3ms, 内存消耗: 352KB, 提交时间: 2022-06-23
# include <stdio.h> int Max(int a,int b) { return (a>b?a:b); } int maxProfit(int* prices, int pricesLen,int k ) { // write code here int i,j,dp1[k+1],dp2[k+1]; //dp1[k+1]第k笔交易未持股或之前已经卖出+ //dp2[k+1]第k笔交易持股,之前已经买入- for(int i=0;i<=k;i++) { dp1[i]=0; dp2[i]=0; } for(i=0;i<pricesLen;i++) { for(j=1;j<=k;j++) { if(i==0) { dp1[j]=0; dp2[j]=-prices[0]; continue; } dp1[j]=Max(dp1[j], dp2[j]+prices[i]); dp2[j]=Max(dp2[j], dp1[j-1]-prices[i]); } } return dp1[k]; } int main() { int pricesLen,k,result,i; scanf("%d %d",&pricesLen,&k); int prices[pricesLen]; for (i=0;i<pricesLen;i++) { scanf("%d",&prices[i]); } result=maxProfit(prices, pricesLen ,k); printf("%d",result); return 0; }
C++ 解法, 执行用时: 3ms, 内存消耗: 408KB, 提交时间: 2022-05-31
#include <vector> #include <cstdio> #include<limits.h> //头文件包含最小值最大值 int main() { int n, k; scanf("%d %d", &n, &k); std::vector<int> prices(n); for (int i = 0; i < n; ++i) { scanf("%d", &prices[i]); } std::vector<std::vector<int>> dp(k + 1, std::vector<int>(2)); dp[0][0] = 0; dp[0][1] = INT_MIN; for (int i = 1; i <= k; ++i) { dp[i][0] = 0; dp[i][1] = -prices[0]; } for (int i = 0; i < n; ++i) { for (int j = k; j >= 1; --j) { // 不持有状态 dp[j][0] = std::max(dp[j][0], dp[j][1] + prices[i]); // 持有状态 dp[j][1] = std::max(dp[j][1], dp[j - 1][0] - prices[i]); } } printf("%d\n", dp[k][0]); return 0; }
C++ 解法, 执行用时: 3ms, 内存消耗: 408KB, 提交时间: 2022-03-18
#include<iostream> #include<vector> using namespace std; int main() { int n, k; cin >> n >> k; // vector<vector<vector<int>>> dp(n, vector<vector<int>>(k + 1, vector<int>(2, // 0))); //vector<vector<int>> dp(k+1,vector<int>(2,0)); vector<int> dp1(k+1,0); vector<int> dp2(k+1,0); int data[n]; for (int i = 0; i < n; i++) { cin >> data[i]; } for (int i = 0; i < n; i++) { for (int j = 1; j <= k; j++) { if (i == 0) { dp1[j] = 0; dp2[j] = -data[i]; continue; } dp1[j] = max(dp1[j],dp2[j]+data[i]); dp2[j] = max(dp2[j],dp1[j-1]-data[i]); //dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j][1] + data[i]); //dp[i][j][1] = max(dp[i - 1][j][1], dp[i - 1][j - 1][0] - data[i]); } } cout<<dp1[k]; return 0; }