考慮dp的話 最笨的方法就是dp[i][j][x][y]代表第一條路走到(i,j) 第二條路走到(x,y)時的最大值 dp[n][m][n][m]即為所求
轉移方程:dp[i][j][x][y]=max(dp[i-1][j][x-1][y],dp[i-1][j][x][y-1],dp[i][j-1][x-1][y],dp[i][j-1][x][y-1])+e[i][j]+e[x][y]*(!(i==x&&j==y))
但是只有當(i+j)==(x+y)時 方程的轉移才是有效的 所以外迴圈改為步數 內兩層迴圈為兩條路的橫座標 縱座標直接通過步數算出來
#include using namespace std;
const int maxn=2e2+10;
const int maxm=2e2+10;
const int maxs=4e2+10;
int dp[maxs][maxn][maxm];
int e[maxn][maxm];
int n,m;
int main()
}for(k=1;k<=n+m-1;k++)}}
printf("%d\n",dp[n+m-1][n][n]);
return 0;}/*
2 21 2
2 1*/
矩陣取數問題 V2 (51Nod 1084 )
乙個m n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,先從左上走到右下,再從右下走到左上。第1遍時只能向下和向右走,第2遍時只能向上和向左走。兩次如果經過同乙個格仔,則該格仔的獎勵只計算一次,求能夠獲得的最大價值。例如 3 3的方格。1 3 3 2 1 3 2 2 1 能夠獲得的最大...
51nod1078 矩陣取數問題 V2
乙個m n矩陣中有不同的正整數,經過這個格仔,就能獲得相應價值的獎勵,先從左上走到右下,再從右下走到左上。第1遍時只能向下和向右走,第2遍時只能向上和向左走。兩次如果經過同乙個格仔,則該格仔的獎勵只計算一次,求能夠獲得的最大價值。例如 3 3的方格。1 3 3 2 1 3 2 2 1 能夠獲得的最大...
51nod1084 矩陣取數問題 V2
o n4 o n3 媽呀為什麼跑這麼慢woc include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i s i t i define...