1277 例9 21 方格取數 動態規劃)

2021-10-08 08:41:48 字數 2195 閱讀 8951

方格取數

題目描述

設有n×n的方格圖,我們在其中的某些方格中填入正整數,而其它的方格中則放入數字0。如下圖所示:

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

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

【輸入】

第一行為乙個整數n(n≤10),表示n×n的方格圖。

接下來的每行有三個整數,第乙個為行號數,第二個為列號數,第三個為在該行、該列上所放的數。一行「0 0 0」表示結束。

【輸出】

第乙個整數,表示兩條路徑上取得的最大的和。

【輸入樣例】

823

13266

3574

41452

21564

63157

21400

0

【輸出樣例】

67
解題思路

這個題我一開始想的是二維的dp,狀態轉移方程:

dp[i][j]=max(dp[i-1][j],dp[i][j-1])+mp[i][j];

先按地圖走一遍,然後然後做下標記,倒著回去將那些取過的數歸0,然後再按地圖走一遍,這樣想起來感覺沒什麼錯誤,但是**只有80分。。。。。

二維dp80分**

#include

#include

#include

using

namespace std;

const

int n =

1005

;int mp[n]

[n];

int dp[n]

[n];

int arr[n]

[n];

int n;

/*void dfs(int x, int y)

*/int

main()

for(

int i =

1; i <= n; i++

)//第一次走方格

} ans +

= dp[n]

[n];

//記錄結果

x = n, y = n;

while

(x >=

1&& y >=1)

memset

(dp,0,

sizeof

(dp));

//重置dp陣列

for(

int i =

1; i <= n; i++

)//第二次走出方格

} ans +

= dp[n]

[n];

//記錄結果

cout << ans << endl;

return0;

}

搞了很久還是只有80分,後來在網上找了下答案,都是用的四維dp,dp[i][j][k][l]就表示兩個人同時走[i][j]表示乙個人,[k][l]表示乙個人,然後兩兩組合就有了四個方向了。

狀態轉移方程:

temp1 = max(dp[i - 1][j][k - 1][l], dp[i - 1][j][k][l - 1]);

temp2 = max(dp[i][j - 1][k - 1][l], dp[i][j - 1][k][l - 1]);

dp[i][j][k][l] = max(temp1, temp2) + mp[i][j];

(這樣分開寫看起來直觀一點)

100分**

#include

#include

using

namespace std;

int mp[15]

[15];

int dp[15]

[15][

15][15

];intmain()

for(

int i =

1; i <= n; i++)}

}}cout << dp[n]

[n][n]

[n]<< endl;

//最終答案

return0;

}

1277 方格取數

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

第九章 動態規劃 1277 例9 21 方格取數

1277 例9.21 方格取數 時間限制 1000 ms 記憶體限制 65536 kb 提交數 2603 通過數 1824 題目描述 設有n n的方格圖,我們在其中的某些方格中填入正整數,而其它的方格中則放入數字0。如下圖所示 某人從圖中的左上角a出發,可以向下行走,也可以向右行走,直到到達右下角的...

1907 方格取數 3

時間限制 2 s 空間限制 256000 kb 題目等級 大師 master 題解檢視執行結果 問題描述 在乙個有m n 個方格的棋盤中,每個方格中有乙個正整數。現要從方格中取數,使任 意2 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。程式設計任務 對於給定的方格棋...