【四維陣列】遊戲
題目描述
小G正在玩一款遊戲,遊戲地圖上有N個點(1到N編號),這些點之間有M條無向邊(沒有重邊)。一次系統重新整理會在某個時刻在某點刷新出一定數量的怪物,系統刷新出來的怪物只會存在1秒,下一秒就會消失。如果那個時刻小G正好在那個點,那麼小G可以秒殺(秒殺所用時間忽略不計,下同)這個點上的所有怪物。 另外,小G還有B次放大招的機會,每次放大招可以秒殺當前點及與其直接相鄰的點上的所有怪物。大招有5秒的冷卻時間,也就是說每次放大招後要經過5秒才能再次放大招(假設在第1秒時發了大招,那下一次發大招的最早時間是第6秒)。 小G可以從任意點開始。系統時間從第1秒開始。他想要知道T秒內他最多可以殺掉多少隻怪物。
輸入
第一行包含5個整數N、M、T、K、B。其中K表示有K次系統重新整理。 接下來是M行,每行有3個整數u、v、t(1≤u≤N,1≤v≤N,u≠v,1≤t≤10)表示從u走到v或者從v走到u需要花費t秒的時間。 然後是K行,每行有3個整數s、p、c(1≤s≤50,1≤p≤N,1≤c≤100)表示第s秒在p點會刷新出c個怪物。
輸出
輸出只有一行,包含一個整數,表示小G在T秒內最多可以殺掉多少隻怪物。
輸入樣例
4 3 5 9 1 1 2 2 2 3 1 2 4 1 1 1 4 2 1 5 3 1 1 3 2 1 5 3 1 5 4 2 4 2 2 4 3 3 4 4 4
輸出樣例
20
說明
【輸入輸出樣例解釋】 第1秒,小G在點1,殺掉4只怪物。 小G停留在點1。 第2秒,小G在點1,殺掉5只怪物。 小G從點1走向點2。 第3秒,小G還在邊上,既殺不了點1和點2的怪物,也不能放大招。 第4秒,小G到達點2,並在點2放大招,一下子殺掉9只怪物。 小G從點2走向點4。 第5秒,小G在點4,殺掉2只怪物。 總共4+5+9+2=20只怪物。 【資料說明】 對於40%的資料,1≤N≤10,1≤T≤15,0≤B≤1。 對於另20%的資料,B=0。 對於100%的資料,1≤N≤50,0≤M≤(N-1)*N/2,1≤T≤50,0≤K≤1000,0≤B≤5。
分析
很簡單的一道動態規劃題。f[i][j][c][d]表示第i秒在第j個點的時候,大招還有c秒,還可以放d次大招。狀態轉移方程看程式
程式碼
#include<bits/stdc++.h> using namespace std; const int N=55; long long f[N+200][N][N][N]; long long a[N][N],w[N][N]; long long n,m,t,r,b,i,j,c,d,k,l,ans; long long maxx(long long x,long long y) { if(x>y) return x; return y; } int main() { cin>>n>>m>>t>>r>>b; for (i=1;i<=m;i++) { cin>>j>>k>>l; a[j][k]=l; a[k][j]=l; } for (i=1;i<=r;i++) { cin>>j>>k>>l; w[j][k]=l; } for (i=1;i<=t;i++) for (j=1;j<=n;j++) for (c=0;c<=5;c++) for (d=0;d<=b;d++) if (f[i][j][c][d]>=0) { if ((c==0)&&(d>0)) { l=f[i][j][c][d]; for (k=1;k<=n;k++) if (a[j][k]>0) l+=w[i][k]; if (l>f[i][j][5][d-1]) f[i][j][5][d-1]=l; } l=f[i][j][c][d]+w[i][j]; if (l>ans) ans=l; if (f[i+1][j][maxx(c-1,0)][d]<l) f[i+1][j][maxx(c-1,0)][d]=l; for (k=1;k<=n;k++) if (a[j][k]>0) if (f[i+a[j][k]][k][maxx(c-a[j][k],0)][d]<l) f[i+a[j][k]][k][maxx(c-a[j][k],0)][d]=l; } cout<<ans; } --------------------- 作者:孫尚香大小姐 來源:CSDN 原文:https://blog.csdn.net/qq_43034907/article/details/83421203 版權宣告:本文為博主原創文章,轉載請附上博文連結!