CodeForces 429B Working out



題目鏈接:http://codeforces.com/problemset/problem/429/B
B. Working out
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the beach. The gym where they go is a matrix a with n lines and m columns. Let number a[i][j] represents the calories burned by performing workout at the cell of gym in the i-th line and the j-th column.

Iahub starts with workout located at line 1 and column 1. He needs to finish with workout a[n][m]. After finishing workout a[i][j], he can go to workout a[i + 1][j] or a[i][j + 1]. Similarly, Iahubina starts with workout a[n][1] and she needs to finish with workout a[1][m]. After finishing workout from cell a[i][j], she goes to either a[i][j + 1] or a[i - 1][j].

There is one additional condition for their training. They have to meet in exactly one cell of gym. At that cell, none of them will work out. They will talk about fast exponentiation (pretty odd small talk) and then both of them will move to the next workout.

If a workout was done by either Iahub or Iahubina, it counts as total gain. Please plan a workout for Iahub and Iahubina such as total gain to be as big as possible. Note, that Iahub and Iahubina can perform workouts with different speed, so the number of cells that they use to reach meet cell may differs.

Input

The first line of the input contains two integers n and m (3 ≤ n, m ≤ 1000). Each of the next n lines contains m integers: j-th number from i-th line denotes element a[i][j] (0 ≤ a[i][j] ≤ 105).

Output

The output contains a single number — the maximum total gain possible.

Example
Input
3 3
100 100 100
100 1 100
100 100 100
Output
800
Note

Iahub will choose exercises a[1][1] → a[1][2] → a[2][2] → a[3][2] → a[3][3]. Iahubina will choose exercises a[3][1] → a[2][1] → a[2][2] → a[2][3] → a[1][3].

         題目大意:A和B分別從1,1走向N,M,從N,1走向1,M。A只能向下或向右走,B只能向上或向右走。兩人有且只有一次相遇,求兩人所走路徑的權值之和並使其最大,兩人相遇的點上的權值不會被計算。

        分析題目可以得出,兩人只能相遇一次,那麼不可能在矩陣邊緣處相遇,這樣的話會導致多次相遇。對於相遇點我們只需枚舉即可。根據AB移動方式我們可以得知兩人只有兩種方式,如圖所

         

此外我們還需要DP出四個頂點到任一點的最大權值,四次DP即可。

然後對於任一相遇點(i,j)按以上兩種方式更新最大值

cnt=max(cnt,dp1[i-1][j]+dp2[i+1][j]+dp4[i][j+1]+dp3[i][j-1]);

cnt=max(cnt,dp1[i][j-1]+dp2[i][j+1]+dp4[i-1][j]+dp3[i+1][j]);


最終AC代碼如下:

#include <stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int map[1005][1050]={0};
int dp1[1005][1005]={0};
int dp2[1005][1005]={0};
int dp3[1005][1005]={0};
int dp4[1005][1005]={0};
int main(int argc, char *argv[])
{
	int n,m;
	while(~scanf("%d %d",&n,&m))
	{
		memset(map,0,sizeof(map));
		memset(dp1,0,sizeof(dp1));
		memset(dp2,0,sizeof(dp2));
		memset(dp3,0,sizeof(dp3));
		memset(dp4,0,sizeof(dp4));
		for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		scanf("%d",&map[i][j]);
		for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
        	dp1[i][j]=max(dp1[i-1][j],dp1[i][j-1])+map[i][j];
        }
        for(int i=n;i>=1;i--)
        for(int j=m;j>=1;j--)
        {
        	dp2[i][j]=max(dp2[i+1][j],dp2[i][j+1])+map[i][j];
        }
        for(int i=1;i<=n;i++)
        for(int j=m;j>=1;j--)
        {
        	dp4[i][j]=max(dp4[i-1][j],dp4[i][j+1])+map[i][j];
        }
        for(int i=n;i>=1;i--)
        for(int j=1;j<=m;j++)
        dp3[i][j]=max(dp3[i+1][j],dp3[i][j-1])+map[i][j];
        int cnt=0;
        for(int i=2;i<n;i++)
        for(int j=2;j<m;j++)
        {
        	cnt=max(cnt,dp1[i-1][j]+dp2[i+1][j]+dp4[i][j+1]+dp3[i][j-1]);
        	cnt=max(cnt,dp1[i][j-1]+dp2[i][j+1]+dp4[i-1][j]+dp3[i+1][j]);
        }
        printf("%d\n",cnt);
	}
	return 0;
}


題目鏈接:http://codeforces.com/problemset/problem/429/B
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章