[HDOJ 4939] Stupid Tower Defense [动态规划]

来源:互联网 发布:人工智能对人类的危害 编辑:程序博客网 时间:2024/06/06 06:38

一条长度为n的直线上有n个塔,每个格一个。塔分为3种,一种会让怪在过了当前格之后每个格多停留一段时间,一种会在怪物在当前格时每秒造成伤害,一种会在怪物过了当前格之后每秒造成伤害。

首先我们可以知道,所有的在当前格造成伤害的塔都会放在最后。

然后对于另外两种塔,定义状态dp[i][j]为i个减速塔和j个攻击塔所能造成的最大伤害,则dp[i][j]可以由dp[i-1][j]和dp[i][j-1]转移过来。

#include <cstdio>long long dp[1501][1501];int n,x,y,z,t;inline long long max(const long long &x,const long long &y) {return x>y?x:y;}inline long long damage(int j) {return j*y;}inline long long time(int i) {return i*z+t;}int main() {int tt,cas,i,j;scanf("%d",&tt);for (cas=1;cas<=tt;cas++) {long long ans=0;scanf("%d%d%d%d%d",&n,&x,&y,&z,&t);for (i=0;i<=n;i++)for (j=0;i+j<=n;j++)dp[i][j]=0;for (i=0;i<n;i++) {for (j=0;i+j<n;j++) {long long tmp=dp[i][j]+damage(j)*time(i);dp[i+1][j]=max(dp[i+1][j],tmp);dp[i][j+1]=max(dp[i][j+1],tmp);}}for (i=0;i<=n;i++)for (j=0;i+j<=n;j++)ans=max(ans,dp[i][j]+(damage(j)+x)*time(i)*(n-i-j));printf("Case #%d: %lld\n",cas,ans);}return 0;}


0 0
原创粉丝点击