首先先算出 n 行中每一行的最值,相加即可
对于每一行来说,在区间 [i,j] 中,dp[i][j]=max(dp[i+1][j]+a[i]*2^i,dp[i][j-1]+a[j]*2^i)
在开始之前,首先要处理一下,将谁放在最后一位提取,因为每一个数都可以是最后一个被提取的
当然在实现过程中需要用到高精度,
但我不会啊(逃)下面的代码只能过 6 个点
const int N=100+5;
int n,m,t;
int i,j,k;
ll a[N][N];
ll dp[N][N];
ll ans=0;
ll pow2[N];
void go(int row)
{
ms(dp,0);
for(i=1;i<=m;i++) dp[i][i]=a[row][i]*pow2[m];
for(int len=2;len<=m;len++){
for(int i=1;i+len-1<=m;i++){
int j=i+len-1;
dp[i][j]=max(dp[i+1][j]+a[row][i]*pow2[m-len+1],dp[i][j-1]+a[row][j]*pow2[m-len+1]);
}
}
ans+=dp[1][m];
//debug(dp[1][m]);
}
int main()
{
//IOS;
while(~sdd(n,m)){
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)
sll(a[i][j]);
}
pow2[1]=2;
for(i=2;i<=m;i++) pow2[i]=pow2[i-1]*2;
for(int i=1;i<=n;i++) go(i);
pll(ans);
}
//PAUSE;
return 0;
}