1. 程式人生 > >【四維陣列】遊戲

【四維陣列】遊戲

題目描述

小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  版權宣告:本文為博主原創文章,轉載請附上博文連結!