動規之 方格取數(dp 四維陣列)

2021-10-05 07:06:25 字數 1467 閱讀 3743

題目描述

設有 n \times n×n 的方格圖 (n \le 9)(n≤9),我們將其中的某些方格中填入正整數,而其他的方格中則放入數字 0。如下圖所示(見樣例):

a 00

0000

0000

13006

0000

0070

0000

01400

00021

0004

0000

15000

00014

0000

0000

0000

00b

某人從圖的左上角的 a 點出發,可以向下行走,也可以向右走,直到到達右下角的 b 點。在走過的路上,他可以取走方格中的數(取走後的方格中將變為數字 0)。

此人從 a 點到 b 點共走兩次,試找出 2 條這樣的路徑,使得取得的數之和為最大。

輸入格式

輸入的第一行為乙個整數 nn(表示 n \times n×n 的方格圖),接下來的每行有三個整數,前兩個表示位置,第三個數為該位置上所放的數。一行單獨的 0 表示輸入結束。

輸出格式

只需輸出乙個整數,表示 2 條路徑上取得的最大的和。

輸入輸出樣例

輸入 #1

823

13266

3574

41452

21564

63157

21400

0

輸出 #1

67
我們可以看成兩個人同時從a點出發到b點

定乙個f [i] [j] [k] [l]的四維陣列,(i , j)代表第乙個人的當前座標(k,l)代表第二個人的當前座標f [i] [j] [k] [l]的內容為當a走到(i , j),b走到(k,l)時,前面所走路徑數字的最大值;

#include

#include

#define maxn 12

int dp[maxn]

[maxn]

;int f[maxn]

[maxn]

[maxn]

[maxn]

;int n,a,b,c;

intmax

(int q,

int p)

intmain()

for(

int i=

1;i<=n;i++

)for

(int j=

1;j<=n;j++

)for

(int k=

1;k<=n;k++

)for

(int l=

1;l<=n;l++

)printf

("%d"

,f[n]

[n][n]

[n])

;return0;

}

四維dp 方格取數

給定乙個 n times n 的方格,只能向下和向右行走,有些方格上有一些數字,其餘為 0 每個數字只能取一次,乙個人從左上角走到右下角兩次能夠取得的數字最大是多少 1 leq n leq 9 兩個人同時走,四維分別表示兩個人,如果兩人的路線相同那麼只能加一次即可 includeusing name...

Acwing 1027 方格取數(四維dp)

傳送門 設有 n n 的方格圖,我們在其中的某些方格中填入正整數,而其它的方格中則放入數字0。如下圖所示 某人從圖中的左上角 a 出發,可以向下行走,也可以向右行走,直到到達右下角的 b 點。在走過的路上,他可以取走方格中的數 取走後的方格中將變為數字0 此人從 a 點到 b 點共走了兩次,試找出兩...

洛谷P1004 方格取數 四維DP

設有 n times nn n 的方格圖 n le 9 n 9 我們將其中的某些方格中填入正整數,而其他的方格中則放入數字 00 如下圖所示 見樣例 a 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 ...