高精度部分就不写了,太难写了.
因为每行取数都是不影响的,所以直接区间dp处理每行即可.
#include <bits/stdc++.h> using namespace std; const int N=85; int f[N][N]; int a[N]; inline int qp(int a,int b) { int res=1; while(b) { if(b&1) res*=a; a*=a; b>>=1; } return res; } int main() { int n,m,ans=0; cin>>n>>m; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>a[j]; } memset(f,0,sizeof f); for(int j=0;j<m;j++) { for(int k=1;k+j<=m;k++) { f[k][k+j]=max(f[k][k+j],max(a[k]*2+2*f[k+1][j+k],a[k+j]*2+2*f[k][j+k-1])); } } ans+=f[1][m]; } cout<<ans<<endl; return 0; } /* 2 3 1 2 3 3 4 2 */