1 条题解
-
1
关键就是每一天的买卖是完全独立的,在每一天尽量赚取最多的钱 因为没有后效性 所以可以使用大法!
$$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
- 上传者