#include<bits/stdc++.h>
#define int __int128
#define ull unsigned long long
#define lf long double
#define INF 0x7fffffff
#define debug(alpha) cout<<alpha<<endl
#define min(a,b) (a>b?b:a)
#define max(a,b) (a>b?a:b)
#define Max3(a,b,c) (max(max((a),(b)),(c)))
#define Min3(a,b,c) (min(min((a),(b)),(c)))
using namespace std;
namespace io
{
template<typename T> inline void iread(T &x114){
char c=' ';int wx114=1;x114=0;
while(!isdigit(c)){c=getchar();if(c=='-')wx114=-1;}
while(isdigit(c)){x114=x114*10+c-'0';c=getchar();}
x114*=wx114;
}
template<typename T> inline void write(T x114){
if(x114==0){putchar('0');return;}
if(x114<0){putchar('-');x114=-x114;}
int stk[50],top=0;
while(x114){stk[++top]=x114%10;x114/=10;}
while(top) putchar(stk[top--]+'0');
}
}
int n,m,ans,sum;
const int N=85;
int a[N];
int dp[N][N];
signed main()
{
io::iread(n);
io::iread(m);
for(int i=1;i<=n;++i)
{
memset(dp,0,sizeof dp);
for(int j=1;j<=m;++j)
io::iread(a[i]);
for(int j=1;j<=m;++j)
for(int k=m;k>=j;--k)
{
dp[j][k]=max(dp[j][k],dp[j-1][k]+a[j-1]*(1<<(m-k+j-1)));
dp[j][k]=max(dp[j][k],dp[j][k+1]+a[k+1]*(1<<(m-k+j-1)));
}
sum=0;
for(int j=1;j<=m;++j)
sum=max(sum,dp[j][j]+a[j]*(1<<m));
ans+=sum;
}
io::write(ans);
return 0;
}
简单阐述一下,命名空间里iread是快读,write是快出,__int128是一个很大的整型,处理__int128的位置没什么问题,问题应该在状态转移方程上,帮忙调试一下,谢谢!