日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU_4939 stupid tower defense 2014多校7 多变量型DP

發(fā)布時間:2024/10/8 编程问答 27 如意码农
生活随笔 收集整理的這篇文章主要介紹了 HDU_4939 stupid tower defense 2014多校7 多变量型DP 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

意思是有個塔防游戲,有三種塔,紅塔在怪物經(jīng)過的時候每秒會產(chǎn)生攻擊力大小的傷害,綠塔對怪物經(jīng)過以及經(jīng)過之后每秒產(chǎn)生攻擊力大小的傷害,還有種藍塔,對怪物進行減速,即怪物從此之后經(jīng)過一個單位都會減慢c秒

最后最最大的傷害值是多少

又是比賽的時候沒想出來,知道是個DP,但是對這種多變量型的DP就是有點不感冒。這個思想其實也是差不多的,你首先得枚舉其中的一個值或者兩個值

這里有個特性,我綠塔和藍塔放越前面越好,紅塔放越后面越好(主要是騰前面的位置給另外兩種),這用了點貪心技巧,但絕對是對的

所以我們可以枚舉某個點 后面全部是放紅塔。。。然后我綠塔和藍塔該怎么處理呢。這個時候我們不能猛想全局,考慮單個點的傷害,前面是綠和藍,后面是紅,這樣在這個點所受的傷害,我枚舉前面藍塔有幾個,則綠塔就是長度-藍的數(shù)目,這樣對該點的傷害我就可以求出來,然后通過i-1過渡出來,就可以得到整個前段受的傷害,再通過直接算出后面紅塔的傷害,就可以得出這個狀態(tài)下受到的總傷害,最后取最大值即可

#include <iostream>
#include <cstdio>
#include <cstring>
#define LL __int64
using namespace std;
LL dp[1510][1510];
int main()
{
int w,kase=0;
LL n,x,y,z,t;
scanf("%d",&w);
while (w--)
{
memset(dp,0,sizeof dp);
scanf("%I64d%I64d%I64d%I64d%I64d",&n,&x,&y,&z,&t);
LL ans=0;
for (int i=1;i<=n;i++){
for (int j=0;j<=i;j++){
if(j<i)
dp[i][j]=dp[i-1][j]+((i-1-j)*z+t)*j*y;
if (j>0){
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+((i-j)*z+t)*(j-1)*y);
} ans=max(ans,dp[i][j]+((i-j)*z+t)*(n-i)*(x+j*y)); }
}
ans=max(ans,n*t*x);
printf("Case #%d: ",++kase);
printf("%I64d\n",ans);
}
}

  

總結(jié)

以上是生活随笔為你收集整理的HDU_4939 stupid tower defense 2014多校7 多变量型DP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。