HDU - 6495

题目链接:HDU - 6495


显然只能dp做,而且dp的状态也很好找的。

dp[i][j]为前 i 个选 j 个剩下的最大血量。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+10;
int n,m,a[N],b[N],c[N],dp[N][N],res;
void solve(){
	cin>>n>>m;	memset(dp,0xcf,sizeof dp);	dp[0][0]=m; res=0;
	for(int i=1;i<=n;i++)	cin>>a[i]>>b[i]>>c[i];
	for(int i=1;i<=n;i++){
		for(int j=0;j<=n;j++){
			dp[i][j]=dp[i-1][j]+c[i];
			if(j&&min(dp[i-1][j-1],b[i])>a[i])	
				dp[i][j]=max(dp[i][j],min(dp[i-1][j-1],b[i])+c[i]-a[i]);
			if(dp[i][j]>0)	res=max(res,j);
		}
	}
	cout<<res<<'\n';
}
signed main(){
	int T; cin>>T; while(T--) solve();
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/107719883
hdu