1. 程式人生 > >codevs 2853:方格遊戲

codevs 2853:方格遊戲

ace 獎勵 計算 hide 題解 數據 ont isp 三維

(排版沒搞好,這一行用來賣萌~)  

技術分享
題目描述 Description
菜菜看到了一個遊戲,叫做方格遊戲~

遊戲規則是這樣的:

在一個n*n的格子中,在每個1*1的格子裏都能獲得一定數量的積分獎勵,記左上角為(1,1),右下角為(n,n)。遊戲者需要選擇一條(1,1)到(n,n)的路徑,並獲得路徑上獎勵的積分。對於路徑當然也有要求啦,要求是只能往坐標變大的方向走【從(x,y)到(x+1,y)或者(x,y+1)】,走過2n-1個區域到達(n,n)。當然,獲得的積分最高的就能取勝啦。

這時,菜菜看到了他的好友月月,於是邀請她來玩雙人版的。雙人版的規則就是在單人版的基礎上加上一條兩人的路線不能相同。月月知道菜菜的很聰明,怕輸得太慘,就不太願意和他玩。菜菜可慌了,於是定義了一個公平值D,這個公平值等於倆人所選擇的路徑所能獲得的積分一一對應相減的差的絕對值之和,即D
=sigma (|kxi-kyi|)|(kx,ky分別為菜菜,月月走過的每一個區域的叢林系數)。不過這可是個龐大的計算任務,菜菜找到了你,請你幫忙計算公平值的最大值。 輸入描述 Input Description 第一行,一個正整數n 接下來的n行,每行n個整數,表示叢林中每個區域的公平值 輸出描述 Output Description 一個整數Dmax,即公平值的最大值 樣例輸入 Sample Input 4 1 2 3 4 1 5 3 2 8 1 3 4 3 2 1 5 樣例輸出 Sample Output 13 數據範圍及提示 Data Size & Hint 對於20
%的數據,保證0<n≤20 對於50%的數據,保證0<n≤50 對於100%的數據,保證0<n≤100且對於所有的i,j保證|Kij|≤300
題目

  芒果君:在看這道題之前,我還沒有聽說dp能MLE,QAQ(不過幸好我不會做就去看題解了2333333)。其實這道題用老套路做也可以出答案,關鍵是怎樣縮空間?如果用步數k來表示狀態,那麽根據兩個人的行數i,j可以推出列數為k-i+2,k-j+2,這樣我們就可以把這個四維的問題轉化成三維,避免了尷尬的MLE。當然你用列也沒問題。dp的話應該仔細理解狀態的繼承(當然對於我這個蒟蒻來說死活都無法理解QAQ)。

 1 #include<cstdio>
 2
#include<cmath> 3 #include<cstdlib> 4 #include<algorithm> 5 using namespace std; 6 int a[110][110],f[220][110][110],n,m,k,i,j,t1,t2; 7 int main() 8 { 9 scanf("%d",&n); 10 for(i=1;i<=n;++i) 11 for(j=1;j<=n;++j) 12 scanf("%d",&a[i][j]); 13 for(k=1;k<=2*n-2;++k) 14 for(i=1;i<=n&&i<=k+1;++i) 15 for(j=1;j<=n&&j<=k+1;++j){ 16 t1=max(f[k-1][i-1][j],f[k-1][i][j-1]); 17 t2=max(f[k-1][i-1][j-1],f[k-1][i][j]); 18 f[k][i][j]=max(f[k][i][j],max(t1,t2)+abs(a[i][k-i+2]-a[j][k-j+2])); 19 } 20 printf("%d\n",f[2*n-2][n][n]); 21 return 0; 22 }

codevs 2853:方格遊戲