Submission #1318255

#TimeUsernameProblemLanguageResultExecution timeMemory
1318255lucageorgescuMaxcomp (info1cup18_maxcomp)C++20
100 / 100
285 ms8220 KiB
#include <bits/stdc++.h>

using namespace std;

const int nmax=1e3+5;
const int inf=2e9+5;

int n,m,a[nmax][nmax];
int dp[nmax][nmax],maxi;

int main()
{
    cin >> n >> m;
    for (int i=1; i<=n; i++ )
        for (int j=1; j<=m; j++ )
            cin >> a[i][j];

    // i1>i2 si j1>j2 -> -i1, -j1 si dupa -(a[i2][j2]-i2-j2)

    for (int i=0; i<=n+1; i++ )
        for (int j=0; j<=m+1; j++ )
           dp[i][j]=inf;

    for (int i=1; i<=n; i++ )
    {
        for (int j=1; j<=m; j++ )
        {
            int val=a[i][j]-min(dp[i-1][j],dp[i][j-1])-i-j;
            maxi=max(maxi,val);

            dp[i][j]=min(min(dp[i-1][j], dp[i][j-1]), a[i][j]-i-j);
        }
    }

    // i1>i2 si j2>j1 -> -i1, +j1 si dupa -(a[i2][j2]-i2+j2)

    for (int i=0; i<=n+1; i++ )
        for (int j=0; j<=m+1; j++ )
           dp[i][j]=inf;

    for (int i=1; i<=n; i++ )
    {
        for (int j=m; j>=1; j-- )
        {
            int val=a[i][j]-min(dp[i-1][j],dp[i][j+1])-i+j;
            maxi=max(maxi,val);

            dp[i][j]=min(min(dp[i-1][j], dp[i][j+1]), a[i][j]-i+j);
        }
    }

    // i1<i2 si j1<j2 -> +i1, +j1 si dupa -(a[i2][j2]+i2+j2)

    for (int i=0; i<=n+1; i++ )
        for (int j=0; j<=m+1; j++ )
           dp[i][j]=inf;

    for (int i=n; i>=1; i-- )
    {
        for (int j=m; j>=1; j-- )
        {
            int val=a[i][j]-min(dp[i+1][j],dp[i][j+1])+i+j;
            maxi=max(maxi,val);

            dp[i][j]=min(min(dp[i+1][j], dp[i][j+1]), a[i][j]+i+j);
        }
    }

    // i1<i2 si j2<j1 -> +i1, -j1 si dupa -(a[i2][j2]+i2-j2)

    for (int i=0; i<=n+1; i++ )
        for (int j=0; j<=m+1; j++ )
           dp[i][j]=inf;

    for (int i=n; i>=1; i-- )
    {
        for (int j=1; j<=m; j++ )
        {
            int val=a[i][j]-min(dp[i+1][j],dp[i][j-1])+i-j;
            maxi=max(maxi,val);

            dp[i][j]=min(min(dp[i+1][j], dp[i][j-1]), a[i][j]+i-j);
        }
    }

    cout << maxi-1;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...