CodeForces 429B B.Working out
2017-09-06 11:34
330 查看
题目传送门
题意:给你一个n*m的网格,A在(1,1)前往(n,m),B在(n,1)前往(m,1),每个人到达一个新的网格就能得到这个网格里面的数字,两个人必须在一个网格相遇(只能相遇一次),且两个人都不能获得这个网格里面的·数字。求两个人能获得最大数字和。
思路:一开始想到枚举,但是枚举每一个点在进行运算的话时间复杂度太高了,所以就一开始预处理一遍每一个点到四个角的最大值,然后在枚举就可以了。一定要注意细节,一开始我认为如果两个人在一个点相遇后就不会在遇见了,但是这个是不对,所以我们要把两个人相遇的两个方式枚举出来,然后还要注意边界是无法相遇的一开始这个地方也没有想到。
题意:给你一个n*m的网格,A在(1,1)前往(n,m),B在(n,1)前往(m,1),每个人到达一个新的网格就能得到这个网格里面的数字,两个人必须在一个网格相遇(只能相遇一次),且两个人都不能获得这个网格里面的·数字。求两个人能获得最大数字和。
思路:一开始想到枚举,但是枚举每一个点在进行运算的话时间复杂度太高了,所以就一开始预处理一遍每一个点到四个角的最大值,然后在枚举就可以了。一定要注意细节,一开始我认为如果两个人在一个点相遇后就不会在遇见了,但是这个是不对,所以我们要把两个人相遇的两个方式枚举出来,然后还要注意边界是无法相遇的一开始这个地方也没有想到。
#include <algorithm> #include <cmath> #include <cstdio> #include <cstring> #include <fstream> #include <iostream> #include <list> #include <map> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <vector> #define MAXN 1010 #define MAXE 5 #define INF 100000000 #define MOD 1000000007 #define LL long long #define pi acos(-1.0) using namespace std; LL dp[MAXE][MAXN][MAXN]; LL arr[MAXN][MAXN]; int main() { std::ios::sync_with_stdio(false); int n, m; cin >> n >> m; memset(dp, 0, sizeof(dp)); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { cin >> arr[i][j]; } } for (int i = n; i >= 1; --i) { for (int j = m; j >= 1; --j) { dp[1][i][j] = max(dp[1][i + 1][j], dp[1][i][j + 1]) + arr[i][j]; } for (int j = 1; j <= m; ++j) { dp[2][i][j] = max(dp[2][i + 1][j], dp[2][i][j - 1]) + arr[i][j]; } } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { dp[3][i][j] = max(dp[3][i - 1][j], dp[3][i][j - 1]) + arr[i][j]; } for (int j = m; j >= 1; --j) { dp[4][i][j] = max(dp[4][i - 1][j], dp[4][i][j + 1]) + arr[i][j]; } } LL ans = 0; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { if (i == 1 || i == n || j == 1 || j == m) continue; LL sum = 0; sum = dp[1][i][j + 1] + dp[3][i][j - 1] + dp[2][i + 1][j] + dp[4][i - 1][j]; ans = max(ans, sum); sum = dp[1][i + 1][j] + dp[3][i - 1][j] + dp[2][i][j - 1] + dp[4][i][j + 1]; ans = max(ans, sum); } } cout << ans << endl; return 0; }
相关文章推荐
- Codeforces - Working out-429B - 动态规划/数塔变形
- [dp] Codeforces 429B B. Working out(动态规划(DP))
- Codeforces 429B B. Working out (DP)
- codeforces 429B B. Working out 详解(dp)
- Codeforces 429B - Working out (DP)
- Codeforces 429B B. Working out
- codeforces 429B B. Working out(dp)
- Codeforces 429B B. Working out 2018-1-30
- dp Codeforces 429B B. Working out
- Codeforces 429B B. Working out
- Working out (CodeForces - 429B )
- Codeforces 429 A. Xor-tree
- Codeforces 429 A. Generous Kefa
- Working out - CODEFORCES, 429B 动态规划
- Codeforces 429 A. Xor-tree
- [dp] Codeforces 429B B. Working out
- codeforces 429 On the Bench dp+排列组合 限制相邻元素,求合法序列数。
- CodeForces 429B【dp】
- CODEFORCES 429B 动态规划
- Codefroces 429 B. Working out