P5662纪念品

做题的状态有点虚,一看到是绿题就自动服软,是读不进去题也下不去手,心理素质不太行,要注意啊

下面是这题的要点

刚开始做的时候就被绕晕了,状态是真的多,每天商品的价格都变,最后要求什么最大钱数,看不懂,虽然看得出是动态规划,但找不到状态转移方程,事实上状态点都没分清,这是做题的最直观感受

这题最主要的点就是,这个当天买和卖,是不会有亏损的,我一开始还想着买肯定比卖贵,结果是一个价,这就是关键,这就导致我可以每天都要最多的钱,因为今天卖不卖压根不影响后面的

把今天手里的钱当做背包的容量

把商品今天的价格当成它的消耗,

把商品明天的价格当做它的价值

这是关键点

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;
}

感悟: 遇见难点的题也不用太发怵,还是得静下心来读题,题目中隐藏着很多要点,还是得专心

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值