国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > ZOJ 3623 Battle Ships 简单DP

ZOJ 3623 Battle Ships 简单DP

来源:程序员人生   发布时间:2014-09-13 08:00:00 阅读次数:3198次

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3623

题意:给出N种可以建造的船和对方的塔生命值L,每种船给出建造时间t[i]和每秒输出dps[i],船坞在同一时间只能建造一支船(类似红警),问多少时间以后能够灭掉塔。

思路:dp[i]代表的是在前i秒内能造成的伤害量,把时间反过来考虑,对于每支船的建造,在前i秒内所占用的建造时间是第i-t[i]+1~i秒,状态转移方程是dp[i+t[j]]=max(dp[i+t[j]],dp[i]+dps[j]*i),由于建设船的时间是第i~t[i]+1~i秒,所以在状态转移时不会出现建设时间的重叠情况。

P.S.比赛的时候不机智了,题意里的each time被我理解成了每秒可以选择造一艘新的船。

代码:

#include <algorithm> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <ctype.h> #include <iostream> #include <map> #include <queue> #include <set> #include <stack> #include <string> #include <vector> #define eps 1e-8 #define INF 0x7fffffff #define maxn 10005 #define PI acos(-1.0) #define seed 31//131,1313 typedef long long LL; typedef unsigned long long ULL; using namespace std; int t[35],dps[35]; int dp[355]; int main() { int N,L; while(~scanf("%d%d",&N,&L)) { memset(dp,0,sizeof(dp)); for(int i=0;i<N;i++) scanf("%d%d",&t[i],&dps[i]); for(int i=0;i<=L+20;i++) for(int j=0;j<N;j++) dp[i+t[j]]=max(dp[i+t[j]],dp[i]+dps[j]*i); for(int i=0;i<=L+20;i++) if(dp[i]>=L) { printf("%d ",i); break; } } return 0; }

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生