P1004 方格取數

2021-09-28 19:49:13 字數 1413 閱讀 9649

題目描述

設有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 ...