codeforces 429B Working out

题意:矩阵  一条线从左上到右下  ,一条 右上到左下, 只能有一个交点,且交点值不算,问你一共能得到多大的值。

解题思路:先求出四个矩阵, 然后枚举点和进入点的方式即可,这里dp问题需要特别考虑边界。

解题代码:

 1 // File Name: 429b.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年03月08日 星期日 10时13分53秒
 4 
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 using namespace std;
26 int a[1005][1005];
27 int ldp[1005][1005];
28 int rdp[1005][1005];
29 int udp[1005][1005];
30 int ddp[1005][1005];
31 int main(){
32   int n , m; 
33   scanf("%d %d",&n,&m);
34   for(int i =1;i <= n;i ++)
35       for(int j = 1;j <= m;j ++)
36           scanf("%d",&a[i][j]);
37   for(int i = 1;i <= n;i ++)
38   {
39      for(int j = 1;j <= m;j ++)
40      {
41         ldp[i][j] = a[i][j] + max(ldp[i][j-1],ldp[i-1][j]);
42      }
43   }
44   for(int i = n;i >=1;i --)
45   {
46      for(int j = 1;j <= m;j ++)
47      {
48         rdp[i][j] = a[i][j] + max(rdp[i][j-1],rdp[i+1][j]);
49      }
50   }
51   for(int i = n;i >=1;i --)
52   {
53      for(int j = m;j >=1;j --)
54      {
55         udp[i][j] = a[i][j] + max(udp[i][j+1],udp[i+1][j]);
56      }
57   }
58   for(int i = 1;i <= n;i ++)
59   {
60      for(int j = m ;j >=1 ;j --)
61      {
62         ddp[i][j] = a[i][j] + max(ddp[i][j+1],ddp[i-1][j]);
63      }
64   }
65   int sum = 0 ; 
66   for(int i = 2;i < n;i ++)
67       for(int j = 2;j < m;j ++)
68       {
69           int tsum = sum; 
70           sum = max(sum,ldp[i-1][j] + udp[i+1][j] + rdp[i][j-1] + ddp[i][j+1]) ;  
71           sum = max(sum,rdp[i+1][j] + ddp[i-1][j] + ldp[i][j-1] + udp[i][j+1]) ;  
72       }
73   printf("%d
",sum);
74 return 0;
75 }
View Code
没有梦想,何谈远方
原文地址:https://www.cnblogs.com/zyue/p/4321450.html