codeforce429B_多线程只有一个相遇点

题目链接: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 }
原文地址:https://www.cnblogs.com/luomi/p/5559629.html