方格取數
題目描述
設有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 個數所在方格沒有公共邊,且取出的數的總和最大。試設計乙個滿足要求的取數演算法。程式設計任務 對於給定的方格棋...