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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hdu4939思维DP

發(fā)布時(shí)間:2023/12/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4939思维DP 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目

Stupid Tower Defense

在坐標(biāo)軸[1,n][1,n][1,n]上,每?jī)蓚€(gè)相鄰的整數(shù)點(diǎn)之間可以放置一座防御塔。

怪物初始時(shí) ttt 秒移動(dòng)一個(gè)單位。

  • 防御塔111:在當(dāng)前線段上的敵人每秒受到xxx傷害。例如在[1,2)[1,2)[1,2)上放置一座防御塔111,怪物在[1,2)[1,2)[1,2)上行走每秒會(huì)受到xxx傷害。

  • 防御塔222:在當(dāng)前線段后的敵人每秒受到yyy傷害。例如在[1,2)[1,2)[1,2)上放置一座防御塔222,怪物在[2,n)[2,n)[2,n)上行走每秒會(huì)受到yyy傷害。

  • 防御塔333:在當(dāng)前線段后的敵人被減速zzz。例如在[1,2)[1,2)[1,2)上放置一座防御塔333,怪物在[2,n)[2,n)[2,n)上行走會(huì)被減速zzz,也就是t=t+zt=t+zt=t+z

防御塔2/3的效果可以疊加。

數(shù)據(jù)范圍 (2<=n<=1500 , 0<=x,y,z<=60000 1<=t<=3)

問(wèn)一個(gè)敵人從111走到nnn受到的最大傷害是多少。

解題思路

經(jīng)過(guò)一點(diǎn)分析,顯然有防御塔1肯定是連續(xù)的放置在最后面一段區(qū)間。

DP[i][j]DP[i][j]DP[i][j]為前iii個(gè)防御塔,放置jjj個(gè)防御塔222i?ji-ji?j個(gè)防御塔333的最大傷害,iii后面全為防御塔333。這時(shí)候,前面防御塔2/3的排列順序?qū)竺娴呢暙I(xiàn)無(wú)影響。只記錄數(shù)量即可。

因此有狀態(tài)轉(zhuǎn)移方程:

dp[i][j] = dp[i-1][j] + V1; dp[i][j] = dp[i-1][j-1] + V2; ans = max(ans , dp[i][j] + 后面全為防御塔1的價(jià)值)

AC代碼

#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <unordered_map> #include <map> #include <vector> using namespace std;const int N = 1505; long long dp[N][N]; //前i個(gè)有j個(gè)減速 i-j個(gè)后攻 int CA; void solve() {memset(dp, 0, sizeof dp);long long n, x, y, z, t;scanf("%lld %lld %lld %lld %lld", &n, &x, &y, &z, &t);long long ans = t * x * n;long long a = 1, b = 0, len = n - 1; //a減速 b后攻 c行程ans = max(ans, (a * z + t) * (b * y + x) * len);a = 0, b = 1, len = n - 1;ans = max(ans, (a * z + t) * (b * y + x) * len);dp[1][0] = 0;dp[1][1] = 0;for (int i = 2; i <= n; i++){for (int j = 0; j <= i; j++){if (!j){dp[i][j] = max(dp[i][j], dp[i - 1][j] + (i - 1) * y * t);long long a = 0, b = i, len = n - i; //a減速 b后攻ans = max(ans, dp[i][j] + (a * z + t) * (b * y + x) * len);}else{//當(dāng)前放減速long long T = t + (j - 1) * z;long long D = ((i - 1) - (j - 1)) * y;dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + T * D); //當(dāng)前放減速long long a = j, b = i - j, len = n - i; //a減速 b后攻ans = max(ans, dp[i][j] + (a * z + t) * (b * y + x) * len);//當(dāng)前放后攻,dp[i][j]從dp[i-1][j]轉(zhuǎn)移 因此只有i!=j 當(dāng)前才能放后攻if (i != j){T = t + j * z;D = ((i - 1) - j) * y;dp[i][j] = max(dp[i][j], dp[i - 1][j] + T * D); //當(dāng)前放后攻a = j, b = i - j, len = n - i; //a減速 b后攻ans = max(ans, dp[i][j] + (a * z + t) * (b * y + x) * len);}}}}printf("Case #%d: %lld\n", ++CA, ans); } int main() {int t;cin >> t;while (t--)solve();return 0; }

總結(jié)

以上是生活随笔為你收集整理的hdu4939思维DP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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