http://acm.hdu.edu.cn/showproblem.php?pid=3851
dp[i]=max(dp[i-1],dp[i-t]+num[i]); dp[i]表示前i个时候最大分数(i时刻不一定要打怪兽)
但是每天那么长 ,数组开不了,参考了下http://blog.sina.com.cn/s/blog_51cea4040100tlfc.html
T只有100,可以求出每天一定可以打的次数
void solve(long long s,long long p,long long t) { long long k; if(s>2*t) k=(s-2*t)/t; else k=0; must+=k*p; int i; for(i=0;i<s-k*t;i++) num[++n]=p; return ;
写出代码:
#include <iostream> #include <cstring> #include <cstdio> using namespace std; long long dp[720000]; long long must; long long num[720000]; int n; void solve(long long s,long long p,long long t) { long long k; if(s>2*t) k=(s-2*t)/t; else k=0; must+=k*p; int i; for(i=0;i<s-k*t;i++) num[++n]=p; return ; } int main() { int Q,cas; scanf("%d",&Q); for(cas=1;cas<=Q;cas++) { int N,T,PD,PN; scanf("%d%d%d%d",&N,&T,&PD,&PN); int i; must=0; n=0; memset(num,0,sizeof(num)); for(i=1;i<=N;i++) { int t1,t2; scanf("%d%d",&t1,&t2); solve(t1,PD,T); solve(t2,PN,T); } memset(dp,0,sizeof(dp)); for(i=1;i<T;i++) dp[i]=num[i]; for(i=T;i<=n;i++) dp[i]=max(dp[i-1],dp[i-T]+num[i]); printf("Case %d: %I64d\n",cas,dp[n]+must); } return 0; }