Hdu4939 Stupid Tower Defense
生活随笔
收集整理的這篇文章主要介紹了
Hdu4939 Stupid Tower Defense
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先說一下題意在一長度為n的格子里放三種塔?
第一種是 red 塔 在經過這個塔時有每秒 x 點的傷害
第二種是 green 塔 在這個塔之后的所有格子都會有一個每秒 y 點的傷害
第三種是 blue 塔 在這個塔之后的所有格子的時間都會增加 z 秒
經過格子有一個初始的時間。求傷害的最大值
貪心是不對的。。。應該用dp;
其中,紅塔一定是放在最后的,所以可以枚舉紅塔的個數k;
dp【i】【j】代表有i個藍塔,j個綠塔當前能取得的最大傷害,用dp【i】【j】來更新dp【i+1】【j】,dp【i】【j+1】;
最后的總傷害等于dp【i】【n-i-k】+k*x*(t+z*i)+(n-i-k)*k*y*(t+z*i)(i從0到n-k)的最大值。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<functional> using namespace std; typedef long long LL; const int N=1505; const int INF=0x3f3f3f3f; LL n,x,y,z,t;LL dp[2000][2000];//dp[i][j] 代表 有i個冰塔j個毒塔 int main() {int T;scanf("%d",&T);for(int cases=1;cases<=T;cases++){LL ans=0LL;scanf("%lld%lld%lld%lld%lld",&n,&x,&y,&z,&t);LL cnt=t;LL cny=0;LL maxx=0LL;memset(dp,0,sizeof(dp));for(int i=0;i<n;i++){for(int j=0;j<n-i;j++){dp[i+1][j]=max(dp[i+1][j],dp[i][j]+j*(t+z*i)*y);dp[i][j+1]=max(dp[i][j+1],dp[i][j]+j*(t+z*i)*y);}}for(int k=1;k<=n;k++) {for(int i=0;i<=n-k;i++){ans=max(ans,dp[i][n-i-k]+k*x*(t+z*i)+(n-i-k)*k*y*(t+z*i));}}printf("Case #%d: %I64d\n",cases,ans);}return 0;}
總結
以上是生活随笔為你收集整理的Hdu4939 Stupid Tower Defense的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matplotlib 改变时间刻度间隔
- 下一篇: 找不到该项目 请确认该项目的位置_裕同拟