傳說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決定讓...