dp 更難的矩陣取數問題

2021-07-09 13:49:48 字數 1155 閱讀 8000

題目:

乙個m*n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,先從左上走到右下,再從右下走到左上。第1遍時只能向下和向右走,第2遍時只能向上和向左走。兩次如果經過同乙個格仔,則該格仔的獎勵只計算一次,求能夠獲得的最大價值。

例如:3 * 3的方格。

1 3 3

2 1 3

2 2 1

能夠獲得的最大價值為:17。1 -> 3 -> 3 -> 3 -> 1 -> 2 -> 2 -> 2 -> 1。其中起點和終點的獎勵只計算1次。

分析:

dp[x1][y1][x2][y2]表示2條並行的路到達(x1,y1),(x2,y2)獲得的最大值

如果(x1,y1) =/= (x2,y2)

dp[x1][y1][x2][y2] = dp[x1'][y1'][x2'][y2'] + val[x1][y1] + val[x2][y2]

否則

dp[x1][y1][x2][y2] = dp[x1'][y1'][x2'][y2'] + val[x1][y1]

觀察知道x1+y1 = x2+y2

所以就可以把4維變成了3維。

dp[steps][x1][x2] = dp[steps-1][x1'][x2'] + val[x1][y1] + val[x2][y2]

**:

#include #include #include using namespace std;

int a[210][210];

int dp[420][210][210];

int m,n;

bool inrange(int x,int y)

return false;

}int dir[2][2] = ;

int main(){

freopen("in.txt","r",stdin);

scanf("%d%d",&m,&n);

for(int i=0;i

多路dp 更難的矩陣取數問題

解題關鍵 1 注意i和j的最大取值都是n,k是i與j的和。2 空間卡的很緊,多一位都不行。轉移方程 dp max a a 通過觀察,可以消去乙個變數,從而 dp k 1 max a a 然後再將相同的處理掉即可 1 include2 using namespace std 3 typedef lon...

更難的矩陣取數問題

題目描述 乙個m n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,先從左上走到右下,再從右下走到左上。第1遍時只能向下和向右走,第2遍時只能向上和向左走。兩次如果經過同乙個格仔,則該格仔的獎勵只計算一次,求能夠獲得的最大價值。例如 3 3的方格。1 3 3 2 1 3 2 2 1 能夠...

簡單DP 矩陣取數問題

乙個n n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,從左上走到右下,只能向下向右走,求能夠獲得的最大價值。例如 3 3的方格。1 3 3 2 1 3 2 2 1 能夠獲得的最大價值為 11。input 第1行 n,n為矩陣的大小。2 n 500 第2 n 1行 每行n個數,中間用空...