这道题唯一需要注意的就是高精度了吧……
思路很简单,首先发现可以每行单独处理,用dp[l,r]表示选择lr区间内的最大收益,有公式
然后就在n2内处理一行,n3处理整个矩阵即可。
值得一提的是高精度__int128不能在一般编译器上跑……并且它不支持cincout,需要自己准备io函数。
#include<bits/stdc++.h>
using namespace std;
const int maxn=81;
__int128 dp[maxn][maxn],ans;
int a[maxn][maxn];
inline void write(__int128 x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
write(x/10);
putchar(x%10+'0');
}
inline __int128 read()
{
__int128 x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
a[i][j]=read();
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
dp[j][j]=a[i][j];
for(int l=2;l<=m;l++){
for(int k=1;k+l-1<=m;k++){
dp[k][k+l-1]=max(dp[k][k+l-2]*2+a[i][k+l-1],dp[k+1][k+l-1]*2+a[i][k]);
}
}
ans+=dp[1][m]*2;
}
write(ans);
}

京公网安备 11010502036488号