由于不会用__int128但想学老师的写法。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef __int128 ll;
const int N=100;
int n,m,a[N];ll dp[N][N],pw[N],ans=0;
ll calc(ll l,ll r,bool isleft){
return dp[l][r]+(isleft?a[l]:a[r])*pw[m-r+l];
}
void init(){
pw[0]=1;
for(int i=1;i<=m;i++){
pw[i]=pw[i-1]*2;
}
}
signed main(){
scanf("%d%d",&n,&m);
init();
while(n--){
for(int j=1;j<=m;j++){
scanf("%d",a+j);
}
memset(dp,0,sizeof(dp));
ll res=0;
for(int j=m-1;j>=0;j--){
for(int k=1;k<=m-j;k++){
dp[k][k+j]=max(calc(k-1,k+j,true),calc(k,k+j+1,false));
if(!j) res=max(res,dp[k][k]+a[k]*pw[m]);
}
}
ans+=res;
}
printf("%d",ans);
return 0;
}