題目描述
設有n×n的方格圖(n≤9),我們將其中的某些方格中填入正整數,而其他的方格中則放入數字00。如下圖所示(見樣例):
0 0 0 0 0 0 0 0
0 0 13 0 0 6 0 0
0 0 0 0 7 0 0 0
0 0 0 14 0 0 0 0
0 21 0 0 0 4 0 0
0 0 15 0 0 0 0 0
0 14 0 0 0 0 0 0
0 0 0 0 0 0 0 0
某人從圖的左上角出發,可以向下行走,也可以向右走,直到到達右下角。在走過的路上,他可以取走方格中的數(取走後的方格中將變為數字0)。
此人從左上角到右下角共走兩次,試找出2條這樣的路徑,使得取得的數之和為最大。
輸入格式
輸入的第一行為乙個整數n(表示n×n的方格圖),接下來的每行有三個整數,前兩個表示位置,第三個數為該位置上所放的數。一行單獨的0表示輸入結束。
輸出格式
只需輸出乙個整數,表示2條路徑上取得的最大的和。
輸入輸出樣例輸入8
2 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
如果是只需要走一遍的話,那用一次dp就可以完成。但是這道題需要走兩遍,而且走第一遍的路徑會對走第二遍的結果產生影響。如果兩遍分開走就需要記錄之前走過的路徑,所以我選擇第一遍用深搜來計算終點的結果並記錄已走過的點。每次到達終點,都dp一遍,複雜度o(22n*n2),不過這道題資料小,也就沒有超時。
#include
using
namespace std;
int n,maxsum;
int a[10]
[10]=
;int b[10]
[10]=
;intdp(
)for
(int j=
2;j<=n;j++
)for
(int i=
2;i<=n;i++)}
return b[n]
[n];
}void
dfs(
int i,
int j,
int sum)
if(idfs(i+
1,j,sum);if
(jdfs(i,j+
1,sum)
; a[i]
[j]=t;
}int
main()
dfs(0,
0,0)
;printf
("%d\n"
,maxsum)
;return0;
}
P1004 方格取數
這題有兩種做法。第一種是同時考慮兩個點,也就是用4個迴圈。列舉每個點的位置,並計算總分。f i j k l max f i j k l f i 1 j k 1 l f i j 1 k l 1 f i 1 j k l 1 f i j 1 k 1 l a i j a k l 當 i k j l 時,多算...
P1004 方格取數
題目描述 設有n n的方格圖 n 9 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。如下圖所示 見樣例 a0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 0 0 21 0 0 0 4 0 0 0 0 15...
P1004 方格取數
洛谷團隊希望加入 題目描述 設有 n times nn n 的方格圖 n le 9 n 9 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字 00。如下圖所示 見樣例 a0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 ...