/*
作者:桦清_L
*/
#include <iostream>
#include <string.h>
using namespace std;
int a[101];
int dp[101][101];
int main()
{
int n,m;
int sum=0;
cin>>n>>m;
for(int now=1;now<=n;now++)
{
memset(dp,0,sizeof(0));
for(int i=1;i<=m;i++) {cin>>a[i]; dp[i][i]=a[i];}
for(int g=2;g<=m;g++) //组数
{
for(int i=1;i<=m-g+1;i++) //起点
{
int j=i+g-1; //组内终点
/*1*2^1+x*2^2+3*2^3=2*(1+2*(2+2*3))*/
dp[i][j]=max(a[i]+dp[i+1][j]*2,a[j]+dp[i][j-1]*2);
}
}
sum+=2*(dp[1][m]);
}
cout<<sum<<endl;
}
Ps:最近都在搞区间dp,发现这题并没有设置从起点移动到终点前一位的for循环,貌似以前做的可以改良一下 减少时间复杂度?