ZOJ 3623 Battle Ships 簡單DP
來源:程序員人生 發布時間:2014-09-13 08:00:00 閱讀次數:3359次
鏈接: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;
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈