1. 程式人生 > >四維動規 洛谷P1004方格取數

四維動規 洛谷P1004方格取數

分析:這個題因為資料量非常小,可以直接用四維的DP陣列

dp[i][j][k][l]表示第一個人走到位置(i,j),第二個人走到位置[k][l]時所取的數的最大和

狀態轉移方程可以輕鬆得出為:dp[i][j][k][l]=max(dp[i-1][j][k-1][l],max(dp[i-1][j][k][l-1],max(dp[i][j-1][k-1][l],dp[i][j-1][k][l-1])))+a[i][j]+a[k][l]

注意,當兩個人走到同一個位置時,因為數取走後就沒了,是需要減去同時走過的位置(這一點是本題的重點,在dp狀態轉移的過程中,會把所有兩個人走的重複的點都遍歷出來,所以在最後最大的結果裡,只要有過兩個人都走過的位置,就會減去一次重複位置處的數值)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const double pi=acos(-1);
 5 const int inf=1<<30;
 6 int a[10][10];
 7 int dp[10][10][10][10];
 8 int main(){
 9     int n;scanf("%d",&n);
10     int x,y,z;
11     while(scanf("%d%d%d",&x,&y,&z)){
12 if(!x&&!y&&!z) break; 13 a[x][y]=z; 14 } 15 for(int i=1;i<=n;i++){ 16 for(int j=1;j<=n;j++){ 17 for(int k=1;k<=n;k++){ 18 for(int l=1;l<=n;l++){ 19 dp[i][j][k][l]=max(dp[i-1][j][k-1][l],max(dp[i-1][j][k][l-1
],max(dp[i][j-1][k-1][l],dp[i][j-1][k][l-1])))+a[i][j]+a[k][l]; 20 if(i==k&&j==l) dp[i][j][k][l]-=a[i][j]; 21 } 22 } 23 } 24 } 25 cout<<dp[n][n][n][n]<<endl; 26 return 0; 27 }