冰水挑战Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 377 Accepted Submission(s): 139 Problem Description Polar Bear Pitching helps you crystallize your message. Input 第一行一个正整数 T (T≤50) 表示数据组数。 Output 对于每组数据输出一行一个数,表示你最多能完成几个挑战。 Sample Input
扫描二维码关注公众号,回复:
5969692 查看本文章
2 3 10 1 2 0 4 8 3 6 10 1 2 1 1 1 1 1 1 1 Sample Output 2 0 |
【解题思路】
设dp[i][j]为前i个挑战当选了j个挑战时的剩余体力的最大值。那么易得:
若不接受第i个挑战:dp[i][j]=max(dp[i][j],dp[i-1][j]+c[i])
若接受第i个挑战:dp[i][j]=max(dp[i][j],min(dp[i-1][j-1],b[i])-a[i]+c[i])
这里需要注意的时候写题的时候千万别忘了dp[i][0]也需要更新!!另外记得写long long 哦!
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1005;
const LL INF=0x3f3f3f3f;
LL dp[maxn][maxn],a[maxn],b[maxn],c[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
memset(dp,-INF,sizeof(dp));
dp[0][0]=m;
for(int i=1;i<=n;i++)
scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);
for(int i=1;i<=n;i++)
{
dp[i][0]=dp[i-1][0]+c[i];
for(int j=1;j<=i;j++)
{
dp[i][j]=max(dp[i][j],dp[i-1][j]+c[i]);
if(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])-a[i]+c[i]);
}
}
for(int i=n;i>=0;i--)
{
if(dp[n][i]>0)
{
printf("%d\n",i);
break;
}
}
}
}