跳转至

区间DP

#include<bits/stdc++.h>
#define Maxn 80
using namespace std;
typedef __int128 ll;
ll a[Maxn+5][Maxn+5],dp[Maxn+5][Maxn+5];
ll read()
{
    ll x=0;
    char c=' ';
    while(c<'0'||c>'9') c=getchar();
    while(c>='0'&&c<='9')
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return x;
}
void print(ll x)
{
    if(x>10) print(x/10);
    putchar('0'+x%10);
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            a[i][j]=read();
        }
    }
    ll ans=0;
    for(int r=0;r<n;r++)
    {
        for(int i=0;i<m;i++) dp[i][i]=a[r][i]<<1;
        for(int len=2;len<=m;len++)
        {
            for(int i=0;i<m;i++)
            {
                int j=i+len-1;
                dp[i][j]=max((a[r][i]<<1)+(dp[i+1][j]<<1),(a[r][j]<<1)+(dp[i][j-1]<<1));
            }
        }
        ans+=dp[0][m-1];
    }
    print(ans);
}