題目描述
設有 n * n 的方格圖, 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。
某人從圖的左上角的 a 點 (1, 1) 出發,可以向下行走,也可以向右走,直到到達右下角的 b 點 (n, n)。
在走過的路上,他可以取走方格中的數(取走後的方格中將變為數字0)。
此人從 a 點到 b 點共走兩次,試找出2條這樣的路徑,使得取得的數之和為最大。
輸入格式
輸入的第一行為乙個整數n(表示 n * n 的方格圖)
接下來的每行有三個整數,前兩個表示位置,第三個數為該位置上所放的數。
一行 「0 0 0」 表示輸入結束。
輸出格式
只需輸出乙個整數,表示2條路徑上取得的最大的和。
樣例輸入
82 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
樣例輸出
67資料範圍
0 < n ≤ 10
題解一
記憶化搜尋:
#include
#include
using
namespace std;
const
int n =15;
int n, ans;
int w[n]
[n];
int f[n]
[n][n]
[n];
intdfs
(int x1,
int y1,
int x2,
int y2)
intmain()
題解二
動態規劃:
題目要求從 a 點到 b 點走兩次,使路徑之和最大。我們可以將它轉換為:兩個人同時從 a 點出發,然後分別走到 b 點。一、
f[x1][y1][x2][y2]
:
二、上上
:第乙個人從(x1 - 1, y1)走過來,第二個人從(x2 - 1, y2)走過來。
上左
:…
左上
:…
左左
:…
#include
using
namespace std;
const
int n =15;
int w[n]
[n];
int f[n]
[n][n]
[n];
intmain()
cout << f[n]
[n][n]
[n]<< endl;
return0;
}
題解三
動態規劃(優化):
f[k][x1][x2]
k
:當前的橫縱座標之和
#include
using
namespace std;
const
int n =15;
int w[n]
[n];
int f[n + n]
[n][n]
;int
main()
cout << f[n + n]
[n][n]
<< endl;
return0;
}
演算法訓練 方格取數
演算法訓練 方格取數 時間限制 1.0s 記憶體限制 256.0mb 問題描述 設有n n的方格圖 n 10 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。某人從圖的左上角的a 點 1,1 出發,可以向下行走,也可以向右走,直到到達右下角的b點 n,n 在走過的路上,他可以取走方格中...
演算法訓練 方格取數
問題描述 設有n n的方格圖 n 10 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。某人從圖的左上角的a 點 1,1 出發,可以向下行走,也可以向右走,直到到達右下角的b點 n,n 在走過的路上,他可以取走方格中的數 取走後的方格中將變為數字0 此人從a點到b 點共走兩次,試找出2...
試題 演算法訓練 方格取數
問題描述 設有nn的方格圖 n 10 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。某人從圖的左上角的a 點 1,1 出發,可以向下行走,也可以向右走,直到到達右下角的b點 n,n 在走過的路上,他可以取走方格中的數 取走後的方格中將變為數字0 此人從a點到b 點共走兩次,試找出2條...