0
已解决
赵逸凡
初级启示者
初级启示者
#include<iostream>
#include<cstring>
using namespace std;
int n, m, a[250][250],f[250][250], ans;
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin >> a[i][j];
for(int row=1; row<=n; row++) {
memset(f, 0, sizeof(f));
int sum=0,r=2;
for(int l=m-2; l>=0; l--) {
for(int i=1; i<=m; i++) {
int j = i+l;
if(j>m) break;
if(i-1>=1)
f[i][j] = max(f[i][j], f[i-1][j]+a[row][i-1]*r);
if(j+1<=m)
f[i][j] = max(f[i][j],f[i][j+1]+a[row][j+1]*r);
}r*=2;}
for(int i=1; i<=m; i++)
sum = max(sum, f[i][i]+a[row][i]*r);
ans+=sum;
}
cout<< ans;
return 0;
}
思路就是dp,每一行取数时判断要不要取这个元素的前驱或者后继,所以为啥40分?