2050 Programming Competition 1006 冰水挑战(DP)

48 篇文章 0 订阅
36 篇文章 0 订阅

冰水挑战

一开始想错了方程。。。导致最后没有做出来。
题解:通过题意我们就可以知道这是一类很基础的背包问题,第 i i i项选与不选,时刻保持体力大于零。
d p [ i ] [ j ] dp[i][j] dp[i][j]表示对于前 i i i个挑战选了 j j j个的最大剩余体力,那么就有,如果不选,则 d p [ i ] [ j ] = m a x ( d p [ i ] [ j ] , d p [ i − 1 ] [ j ] + c [ i ] ) dp[i][j] = max(dp[i][j],dp[i - 1][j] + c[i]) dp[i][j]=max(dp[i][j],dp[i1][j]+c[i]);如果体力足够并且选了第 i i i项,则 d p [ i ] [ j ] = m a x ( d p [ i ] [ j ] , d p [ i − 1 ] [ j − 1 ] − a [ i ] + c [ i ] ) , ( m i n ( d p [ i − 1 ] [ j − 1 ] , b [ i ] ) − a [ i ] > 0 ) dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] - a[i] + c[i]),(min(dp[i - 1][j - 1],b[i]) - a[i] > 0) dp[i][j]=max(dp[i][j],dp[i1][j1]a[i]+c[i]),(min(dp[i1][j1],b[i])a[i]>0)

代码

#include<bits/stdc++.h>

#define DEBUG(x) std::cerr << #x << '=' << x << std::endl
typedef long long LL;
using namespace std;
const int N = 1024, inf = INT_MAX >> 1;
LL a[N],b[N],c[N],n;
LL dp[N][N];

int main()
{
#ifndef ONLINE_JUDGE
    freopen("input.in","r",stdin);
#endif
    ios::sync_with_stdio(false); cin.tie(0);
	int T,C;
	cin >> T;
	while(T--) {
		cin >> n >> C;
		for(int i = 1; i <= n; ++i) {
			cin >> a[i] >> b[i] >> c[i];
		}
		memset(dp, -0x3f, sizeof dp);
		dp[0][0] = C;
		for(int i = 1; i <= n; ++i) {
			for(int j = 0; j <= i; ++j) {
				LL cur = min(dp[i - 1][j - 1], b[i]);
				dp[i][j] = max(dp[i - 1][j] + c[i], ((cur - a[i] > 0 )? (cur - a[i] + c[i]) : dp[i][j]));
			}
		}
		int ans = 0;
		for(int i = n; i >= 0; --i) {
			if(dp[n][i] > 0) {
				ans = i;
				break;
			}
		}
		cout << ans << endl;
	}
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值