做题的状态有点虚,一看到是绿题就自动服软,是读不进去题也下不去手,心理素质不太行,要注意啊
下面是这题的要点
刚开始做的时候就被绕晕了,状态是真的多,每天商品的价格都变,最后要求什么最大钱数,看不懂,虽然看得出是动态规划,但找不到状态转移方程,事实上状态点都没分清,这是做题的最直观感受
这题最主要的点就是,这个当天买和卖,是不会有亏损的,我一开始还想着买肯定比卖贵,结果是一个价,这就是关键,这就导致我可以每天都要最多的钱,因为今天卖不卖压根不影响后面的
把今天手里的钱当做背包的容量,
把商品今天的价格当成它的消耗,
把商品明天的价格当做它的价值,
这是关键点
f[i]为用 ii 元钱去购买商品所能盈利的最大值(不含成本)
转移方程: f[j] = max(f[j], f[j - price[i][k]] + price[i][k + 1] - price[i][k]);f[j]=max(f[j],f[j−price[i][k]]+price[i][k+1]−price[i][k]);
#include<bits/stdc++.h>
#define endl '\n'
#define int int64_t
using namespace std;
//这题的关键点在于,当天买完再卖,或者卖完再买,没有任何损失,就才是关键,所以我每天都要求钱最多
int t, n, m, v[105][105], f[10005];
signed main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> t >> n >> m;
for (int i = 1; i <= t; ++i)
for (int j = 1; j <= n; ++j)
cin >> v[i][j];
//今天手里的钱就是容量,今天的价格是消耗,明天的价格当价值
//f[i]是i元去买的最大收益
for (int i = 1; i < t; ++i) {
memset(f, 0, sizeof f);
for (int j = 1; j <= n; ++j)
for (int k = v[i][j]; k <= m; ++k)
f[k] = max(f[k], f[k - v[i][j]] + v[i + 1][j] - v[i][j]);
m += f[m];
}
cout << m << endl;
return 0;
}
感悟: 遇见难点的题也不用太发怵,还是得静下心来读题,题目中隐藏着很多要点,还是得专心