1 条题解
-
0
其实和纪念品是一样的,我的代码是复制过来的。
首先是一个思想:你想第一天就买进,等到最后一天就卖出,相当于你第一天买了,第二天立即卖出,然后再买回来,第三天再立即卖出,以此类推,等到最后一天再买回来,再卖出。
所以每一天可以独立决策。
那每一天都要做哪些决策呢?
买进任意一只股票任意张,然后明天必须卖掉并赚取差价。
用完全背包即可。
DP 方程如下。
$$dp_{i, j, k} = \max\{dp_{i, j-1, k-price_{i, j}}+price_{i+1,j}-price_{i, j} \}$$其中表示第 天,考虑到第 个物品,手中持有 元现金时明天最多可以得到的钱。
要把 和 两个维度压掉,只保留 这一个维度,即手持的现金数量。
最后注意了:本题和纪念品的区别有:
-
数据范围不同。
-
输入顺序不同。
-
没了!!!
上代码:
#include <bits/stdc++.h> using namespace std; int T, N, M; int ans; int dp[500010], p[15][55]; int main() { cin >> N >> T >> M; for (int j = 1; j <= N; j++) { for (int i = 1; i <= T; i++) { cin >> p[i][j]; } } for (int i = 1; i <= T; i++) { memset(dp, 0, sizeof(dp)); ans = 0; dp[M] = M; for (int j = 1; j <= N; j++) { for (int k = M; k >= p[i][j]; k--) { dp[k - p[i][j]] = max(dp[k - p[i][j]], dp[k] + p[i + 1][j] - p[i][j]); } } for (int k = 0; k <= M; k++) ans = max(ans, dp[k]); M = ans; } cout << M << endl; return 0; } -
- 1
信息
- ID
- 869
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 17
- 已通过
- 9
- 上传者