探尋寶藏 雙向dp

2021-07-11 03:28:17 字數 1364 閱讀 6795

傳說hmh大沙漠中有乙個m*n迷宮,裡面藏有許多寶物。某天,dr.kong找到了迷宮的地圖,他發現迷宮內處處有寶物,最珍貴的寶物就藏在右下角,迷宮的進出口在左上角。當然,迷宮中的通路不是平坦的,到處都是陷阱。dr.kong決定讓他的機械人卡多去探險。

但機械人卡多從左上角走到右下角時,只會向下走或者向右走。從右下角往回走到左上角時,只會向上走或者向左走,而且卡多不走回頭路。(即:乙個點最多經過一次)。當然卡多順手也拿走沿路的每個寶物。

dr.kong希望他的機械人卡多盡量多地帶出寶物。請你編寫程式,幫助dr.kong計算一下,卡多最多能帶出多少寶物。

第一行: k 表示有多少組測試資料。 

接下來對每組測試資料:

第1行: m n

第2~m+1行: ai1 ai2 ……ain (i=1,…..,m)

【約束條件】

2≤k≤5 1≤m, n≤50 0≤aij≤100 (i=1,….,m; j=1,…,n)

所有資料都是整數。 資料之間有乙個空格。

對於每組測試資料,輸出一行:機械人卡多攜帶出最多價值的寶物數

22 30 10 1010 10 80
3 30 3 92 8 55 7 100
120
134
題意很清晰啦,乙個機械人從(1,1)點出發到(m,n)點,再從(m,n)點回到最初點。我們可以把它看成在(1,1)點同時有兩個機械人出發到(m,n)點。

我開始做的是四維的。f[i][j][x][y]表示 : 機械人一在(i,j),機械人2在(x,y)時所收集的寶藏最多是多少。機械人1從上面(i-1 , j)或者左面(i , j-1)走到(i, j),機械人2從上面(x-1, y)或者左面(x, y-1)走到(x, y). 所以f[i][j][x][y] = max(f[i-1][j][x-1][y],  f[i-1][j][x][y-1],  f[i][j-1][x-1][y],  f[i][j-1][x][y-1]). 上一狀態有四種情況。

這需要四層迴圈,如果矩陣太大的話就容易超啦。不過我們發現有些細節,這樣可以減少一部分無用的迴圈。注意 : 同一時間兩個機械人走的步數是一樣的,也就是i+j= x+y。

#include#include#includeusing namespace std;

int e[55][55],dp[55][55][55][55],n,m;

int x1[4] = , y1[4] = , x2[4]=, y2[4] = ;

void dp1()}}

} }}int main()

} dp1();

printf("%d\n",dp[n][m-1][n-1][m]+e[n][m]);

} return 0;

}

NYOJ712 探尋寶藏

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 傳說hmh大沙漠中有乙個m n迷宮,裡面藏有許多寶物。某天,dr.kong找到了迷宮的地圖,他發現迷宮內處處有寶物,最珍貴的寶物就藏在右下角,迷宮的進出口在左上角。當然,迷宮中的通路不是平坦的,到處都是陷阱。dr.kong決定讓...

nyoj 712 探 尋 寶 藏

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 傳說hmh大沙漠中有乙個m n迷宮,裡面藏有許多寶物。某天,dr.kong找到了迷宮的地圖,他發現迷宮內處處有寶物,最珍貴的寶物就藏在右下角,迷宮的進出口在左上角。當然,迷宮中的通路不是平坦的,到處都是陷阱。dr.kong決定讓...

nyoj 712探 尋 寶 藏

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 傳說hmh大沙漠中有乙個m n迷宮,裡面藏有許多寶物。某天,dr.kong找到了迷宮的地圖,他發現迷宮內處處有寶物,最珍貴的寶物就藏在右下角,迷宮的進出口在左上角。當然,迷宮中的通路不是平坦的,到處都是陷阱。dr.kong決定讓...