题意:矩阵 一条线从左上到右下 ,一条 右上到左下, 只能有一个交点,且交点值不算,问你一共能得到多大的值。
解题思路:先求出四个矩阵, 然后枚举点和进入点的方式即可,这里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 }