1 条题解

  • 1
    @ 2024-10-24 12:57:21

    关键就是每一天的买卖是完全独立的,在每一天尽量赚取最多的钱 因为没有后效性 所以可以使用DP\Large\text{DP}大法!

    $$dp[k - a[i][j]] = max(dp[k - a[i][j]], dp[k] + a[i + 1][j] - a[i][j]); $$$$\ \ \ \ \ \ \ max(don't \ buy \ anything,原本的钱+明天赚的钱-今天的成本) $$
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    int dp[10005], a[105][105];//dp[i]存手中剩i元时,全卖掉时剩下的钱
    
    int main() {
        int t, n, m, awa;
        scanf("%d%d%d", &t, &n, &m);
        
        for (int i = 1; i <= t; ++i) {
            for (int j = 1; j <= n; ++j) {
                scanf("%d", &a[i][j]);
            }
        }
        
        awa = m;
        for (int i = 1; i < t; i++)//每一天都推,赚到最多的钱
          {
            
            memset(dp, ~0x3f, sizeof(dp));
           
            dp[awa] = awa;//初始剩awa块能拿awa块钱(因为你没买没卖啊)
            
            for (int j = 1; j <= n; j++) {
                
                for (int k = awa; k >= a[i][j]; --k) {
                  
                    dp[k - a[i][j]] = max(dp[k - a[i][j]], dp[k] + a[i + 1][j] - a[i][j]);
                }
            }//背包啊
            int ma = 0;
            for (int j = 0; j <= awa; ++j) {
                ma = max(ma, dp[j]);//所有情况找最大值;
            }
            awa = ma;
        }
        cout << awa << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    269
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    2
    上传者