Codeforces 429B B. Working out (DP)

原创 2016年08月28日 17:00:34
传送门:B. Working out

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.

Examples
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 exercisesa[3][1] → a[2][1] → a[2][2] → a[2][3] → a[1][3].


题意:

给n*m的矩阵,每个格子有个数,A从(1,1)出发只能向下或右走,终点为(n,m),B从(n,1)出发只能向上或右走,终点为(1,m)。两个人的速度不一样,走到的格子可以获的该格子的数,两人相遇的格子上的数两个人都不能拿。求A和B能拿到的数的总和的最大值。

n,m<=1000

思路:

dp.

先预处理出每个格子到四个角落格子的路径最大数值,然后枚举两个人相遇的交点格子,枚举A、B的进来和出去方式,求最大值即可。

注意边界情况。处理的时候细心点,还得耐心点。

代码:

#include <bits/stdc++.h>
#define Memset(x, a) memset(x, a, sizeof(x))
#define ll __int64
using  namespace  std;

const int inf=0x3f3f3f3f;
const int N=1010;

ll  dp[5][N][N];
ll a[N][N];

int  main(){
  std::ios::sync_with_stdio(false);
  std::cin.tie(0);

  int n,m;
  while(cin>>n>>m){
    Memset(a, 0);
    for(int i=1; i<=n; i++)
      for(int j=1; j<=m; j++)
        cin>>a[i][j];
    Memset(dp, 0);
    for(int i=1; i<=n; i++){
      for(int j=1; j<=m; j++)
        dp[1][i][j]=max(dp[1][i-1][j], dp[1][i][j-1])+a[i][j];
      for(int j=m; j>=1; j--)
        dp[3][i][j]=max(dp[3][i-1][j], dp[3][i][j+1])+a[i][j];
    }
    for(int i=n; i>=1; i--){
      for(int j=1; j<=m; j++)
        dp[2][i][j]=max(dp[2][i+1][j], dp[2][i][j-1])+a[i][j];
      for(int j=m; j>=1; j--)
        dp[4][i][j]=max(dp[4][i+1][j], dp[4][i][j+1])+a[i][j];
    }
    for(int i=0; i<=n+1; i++)    //把四个边界都置为无效情况 
      for(int k=1; k<=4; k++)
        dp[k][i][0]=dp[k][i][m+1]=-inf;
    for(int j=0; j<=m+1; j++)
      for(int k=1; k<=4; k++)
        dp[k][0][j]=dp[k][n+1][j]=-inf;
    ll ans=0;
    for(int i=1; i<=n; i++){ 
      for(int j=1; j<=m; j++){
        //只用考虑两种情况 两个人只能交叉一个格子,多了的话不合算 
        ll tmp=dp[1][i][j-1]+dp[4][i][j+1]+dp[2][i+1][j]+dp[3][i-1][j];
        ans=max(ans, tmp);
        tmp=dp[1][i-1][j]+dp[4][i+1][j]+dp[2][i][j-1]+dp[3][i][j+1];
        ans=max(ans, tmp);
      }
    }
    cout<<ans<<endl;
  }
  return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guhaiteng/article/details/52346611

网络工程师CIDR技术强化训练教程

网络工程师考试考察知识点繁多,形式多样。如何有效把握每种考察形式,拿到相应分数?这是历年考生最挠头的事情。本系列课程紧抓考生痛点,对网工考试中重点题型分门别类讲解,反复强化训练,助力考生查缺补漏,拿到相应分数。本次分课程重点讲解了配置题型中CIDR协议配置方法。通过基本概念阐述->实战配置演示->全真模拟题强化训练,三大步骤帮助考生掌握RIP配置方法,拿到相应分数。
  • 2016年07月22日 10:30

codeforces429B Working out (DP)

题目链接:戳这里 题目大意:有一个n*m的矩形,一个人从(1,1)出发,只能向下或向右走到(n,m),另一人从(n,1)出发,只能向上或向右走到(1,m),两人的路径最多只能有1个交点,且交点的值不...
  • qq_39791208
  • qq_39791208
  • 2017-12-27 09:03:58
  • 68

CodeForces 429B Working out // 递推dp

题目描述CodeForces 429B Working out解题思路题目大意: 有n*m个格子, 走过一个格子可以得到相应的分数. A 从(1,1)开始沿 下 或 右 走到(n,m) B 从(...
  • xmzyt1996
  • xmzyt1996
  • 2015-08-12 21:54:48
  • 757

codeforces 429B B. Working out(dp)

题目链接:codeforces 429B题目大意:给出一个矩阵,一个人从左上角走到右下角,一个人从左下角走到右上角,两个人只会在一个点相交,问两个人经过路径上的数的和最大的情况下最大和是多少。题目分析...
  • qq_24451605
  • qq_24451605
  • 2015-09-16 21:25:58
  • 1437

CodeForces 429B Working out(dp,四个角递推)

B. Working out Summer is coming! It's time for Iahub and Iahubina to work out, as they both w...
  • Code_KK
  • Code_KK
  • 2015-10-13 19:35:25
  • 1007

CodeForces429B WorkingOut

使用动态规划求解,思想还是很简单的,lahub只能向右和向下,lahubina只能向右和向上,限制条件就是只能相遇一次。 分析一下就能知道除边界点外其他所有点都有可能成为相遇点,对相遇点进行...
  • blueskyliulan
  • blueskyliulan
  • 2015-07-23 11:18:27
  • 493

cfB. Luba And The Ticket time limit per test2 seconds memory limit per test256 megabytes inputstanda

B. Luba And The Ticket time limit per test 2 seconds memory limit per test 256 megabytes...
  • a197p
  • a197p
  • 2017-08-22 09:12:42
  • 678

B. Working out----暴力dp

B. Working out time limit per test 2 seconds memory limit per test 256 megabytes in...
  • bless924295
  • bless924295
  • 2017-04-10 16:01:24
  • 257

CodeForces 429B Working out

题目链接:http://codeforces.com/problemset/problem/429/B B. Working out time limit per test 2 secon...
  • QQ877801131
  • QQ877801131
  • 2016-12-29 11:35:01
  • 248

codeforces 429B B. Working out 详解(dp)

D. Working out time limit per test 2 seconds memory limit per test 256 megabytes input standard i...
  • qq_34374664
  • qq_34374664
  • 2017-01-16 22:27:41
  • 668
收藏助手
不良信息举报
您举报文章:Codeforces 429B B. Working out (DP)
举报原因:
原因补充:

(最多只允许输入30个字)