1 条题解

  • 0
    @ 2026-9-23 1:11:40

    其实和纪念品是一样的,我的代码是复制过来的。

    首先是一个思想:你想第一天就买进,等到最后一天就卖出,相当于你第一天买了,第二天立即卖出,然后再买回来,第三天再立即卖出,以此类推,等到最后一天再买回来,再卖出。

    所以每一天可以独立决策。

    那每一天都要做哪些决策呢?

    买进任意一只股票任意张,然后明天必须卖掉并赚取差价。

    用完全背包即可。

    DP 方程如下。

    $$dp_{i, j, k} = \max\{dp_{i, j-1, k-price_{i, j}}+price_{i+1,j}-price_{i, j} \}$$

    其中表示第 ii 天,考虑到第 jj 个物品,手中持有 kk 元现金时明天最多可以得到的钱。

    要把 ii 和 jj 两个维度压掉,只保留 kk 这一个维度,即手持的现金数量。

    最后注意了:本题和纪念品的区别有:

    1. 数据范围不同。

    2. 输入顺序不同。

    3. 没了!!!

    上代码:

    #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
    上传者