【DP】游戏
游戲
題目大意:
有一個圖,第s秒在點p會出現c個怪物(過了這一秒就會消失),小明可以從任意一個點出發(從第一秒開始),有m條路徑(無向),鏈接著兩個點,距離就是走這條路時間,當小明在某一個點時,他可以直接秒殺當前點的怪物,或者放大招,秒殺當前點的怪物和連接著此點的所有點的怪物。問t秒內小明最多殺多少個怪獸
原題:
題目描述
小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[t][i][d1][d2]來表示第t秒在點i,大招剩余d1次,大招冷卻秒數為d2可以殺的最多的怪物數,然后先枚舉當前的四個數,然后求出放大招可以殺的怪物數,然后再向接下來可以走的點延伸就行了
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int n,m,t,k,b,x,y,w,head[55]; long long c,ans,sum,gg[55][55],g[55][55],f[255][55][10][10]; long long maxx(long long aa,long long bb) {if (aa>bb) return aa;return bb; } int main() {scanf("%d %d %d %d %d",&n,&m,&t,&k,&b);for (int i=1;i<=m;++i){scanf("%d %d %lld",&x,&y,&c);gg[x][y]=c;//鄰接矩陣記錄gg[y][x]=c;//無向}for (int i=1;i<=k;++i){scanf("%d %d %lld",&x,&y,&c);g[x][y]=c;//記錄}for (int tt=1;tt<=t;++tt)//時間for (int i=1;i<=n;++i)//地點for (int d2=0;d2<=5;++d2)//大招冷卻時間for (int d1=0;d1<=b;++d1)//大招剩余次數{if (!d2&&d1)//可以放大招{sum=0;for (int j=1;j<=n;++j)if (gg[i][j])sum+=g[tt][j];//累加f[tt][i][d1-1][5]=maxx(f[tt][i][d1-1][5],f[tt][i][d1][d2]+sum);//看看放不放}f[tt][i][d1][d2]+=g[tt][i];//相加ans=maxx(ans,f[tt][i][d1][d2]);//求最大的f[tt+1][i][d1][maxx(d2-1,0)]=maxx(f[tt+1][i][d1][maxx(d2-1,0)],f[tt][i][d1][d2]);//原地不動for (int j=1;j<=n;++j)if (gg[i][j])f[tt+gg[i][j]][j][d1][maxx(d2-gg[i][j],0)]=maxx(f[tt+gg[i][j]][j][d1][maxx(d2-gg[i][j],0)],f[tt][i][d1][d2]);//向其他點走}printf("%lld",ans); }總結
- 上一篇: 【DP】序列
- 下一篇: 【树状数组】【dfs】树