题目链接:http://codeforces.com/contest/429/problem/B
题意:给你一个矩阵,一个人从(1, 1) ->(n, m), 一个人从(n, 1) ->(1, m), 必须 有一个相遇点, 相遇点的值不能被得到, 问两个人能得到的最大值和是多少?
思路, dp1[i][j] 是从(1, 1)到达(i, j)时的最大值,同理, 看代码
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cstdlib> 6 #include <cmath> 7 #include <set> 8 #include <map> 9 #define LL long long 10 #include <vector> 11 using namespace std; 12 13 const int N = 1005; 14 LL num[N][N]; 15 LL dp1[N][N], dp2[N][N], dp3[N][N], dp4[N][N], dp[N][N]; 16 int main() 17 { 18 int n, m; 19 scanf("%d %d", &n, &m); 20 memset(dp1, 0, sizeof(dp1)); 21 memset(dp2, 0, sizeof(dp2)); 22 memset(dp3, 0, sizeof(dp3)); 23 memset(dp4, 0, sizeof(dp4)); 24 memset(dp, 0, sizeof(0)); 25 for(int i = 1; i <= n; i++) 26 for(int j = 1; j <= m; j++) 27 scanf("%I64d", &num[i][j]); 28 for(int i = 1; i <= n; i++) 29 for(int j = 1; j <= m; j++) 30 dp1[i][j] = max(dp1[i - 1][j], dp1[i][j - 1]) + num[i][j]; 31 for(int i = 1; i <= n; i++) 32 for(int j = m; j > 0; j--) 33 dp2[i][j] = max(dp2[i - 1][j], dp2[i][j + 1]) + num[i][j]; 34 for(int i = n; i > 0; i--) 35 for(int j = 1; j <= m; j++) 36 dp3[i][j] = max(dp3[i + 1][j], dp3[i][j - 1]) + num[i][j]; 37 for(int i = n; i > 0; i--) 38 for(int j = m; j > 0; j--) 39 dp4[i][j] = max(dp4[i + 1][j], dp4[i][j + 1]) + num[i][j]; 40 LL res = 0; 41 for(int i = 2; i < n; i++) 42 for(int j = 2; j < m; j++){ 43 res = max(res, dp1[i - 1][j] + dp2[i][j + 1] + dp3[i][j - 1] + dp4[i + 1][j]);//因为(i, j)后退的方向只有四个,四个方向来的情况只有两种情况,自行想象一下 44 res = max(res, dp1[i][j - 1] + dp2[i - 1][j] + dp3[i + 1][j] + dp4[i][j + 1]); 45 } 46 printf("%I64d ", res); 47 return 0; 48 }