HDU 4939 Stupid Tower Defense 简单DP
生活随笔
收集整理的這篇文章主要介紹了
HDU 4939 Stupid Tower Defense 简单DP
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
地圖為長為n個單位長度的直線,每通過一個單位長度需要t秒。
有3種塔,紅塔可以在當前格子每秒造成x點傷害,綠塔可以在之后格子造成y點傷害,藍塔可以使通過單位長度的時間增加z秒。
讓你安排塔的排列是造成的傷害最大。
?
思路:
最開始想到dp,狀態dp[i][r][g][b]表示:假設前i格放了r個紅塔、g個綠塔和b個藍塔,枚舉第i+1格放什么。
因為長度最大為1500,所以如果這樣開狀態的話,需要1500^4的空間,這顯然是開不下的。
后來想到,一種塔的數量可以表示成總數減去另外兩種塔的數量,這樣的話,就可以減掉一維,變成dp[i][g][b],還是會超空間。
然后想到,紅塔只在當前格子有效,所以不用記錄有多少紅塔,只需要知道有多少綠塔和藍塔就好了,也不用記錄當前是第幾格。所以狀態變成了dp[g][b]。
但是,這樣子時間復雜度仍然是n^3的,會超時。
可以證明,如果存在紅塔,放在后面一定比放在前面更優。所以,只需要dp前面有g個綠塔和b個藍塔時候造成的最大傷害,然后在求解的時候計算出后面全是紅塔。 所以,時間復雜度也變成了n^2。這樣子就可以解了。
?
代碼:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 #include <string> 8 #include <queue> 9 #include <stack> 10 #include <vector> 11 #include <map> 12 #include <set> 13 #include <functional> 14 #include <time.h> 15 16 using namespace std; 17 18 typedef __int64 ll; 19 20 const int INF = 1<<30; 21 const int MAXN = 1555; 22 23 ll dp[MAXN][MAXN]; //dp[i][j]: 前面i+j個塔中,有i個green,j個blue 24 ll n, x, y, z, t; 25 26 void solve() { 27 scanf("%I64d%I64d%I64d%I64d%I64d", &n, &x, &y, &z, &t); 28 29 memset(dp, 0, sizeof(dp)); 30 for (int i = 0; i < n; i++) 31 for (int j = 0; j+i < n; j++) { 32 dp[i+1][j] = max(dp[i+1][j], dp[i][j]+(i*y)*(t+j*z)); 33 dp[i][j+1] = max(dp[i][j+1], dp[i][j]+(i*y)*(t+j*z)); 34 } 35 36 ll ans = 0; 37 for (int i = 0; i <= n; i++) 38 for (int j = 0; i+j <= n; j++) 39 ans = max(ans, dp[i][j]+((n-i-j)*(x+i*y))*(t+z*j)); 40 41 printf("%I64d\n", ans); 42 } 43 44 int main() { 45 #ifdef Phantom01 46 freopen("HDU4939.txt", "r", stdin); 47 #endif //Phantom01 48 49 int T; 50 scanf("%d", &T); 51 for (int i = 1; i <= T; i++) { 52 printf("Case #%d: ", i); 53 solve(); 54 } 55 56 return 0; 57 } View Code
?
轉載于:https://www.cnblogs.com/Phantom01/p/3909427.html
總結
以上是生活随笔為你收集整理的HDU 4939 Stupid Tower Defense 简单DP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【技巧】git撤销上次提交
- 下一篇: MPV视频播放器开发日志(02)字幕下载