只过了1、3两个点
f[i][j] 表示从i开始的j个数
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=100;
long long f[maxn][maxn],num[maxn],n,m,ans=0,sum;
inline long long llmin(long long x,long long y){
if(x>y) return y;
else return x;
}
inline long long llmax(long long x,long long y){
if(x<y) return y;
else return x;
}
int main(){
scanf("%lld%lld",&n,&m);
for(int q=1;q<=n;q++){
memset(f,0,sizeof(f));
for(int i=1;i<=m;i++){
scanf("%lld",&num[i]);
f[i][1]=num[i]*2;
}
for(int i=2;i<=m;i++){
for(int j=1;j<=m-i+1;j++){
for(int k=1;k<i;k++){
if(f[j][k]>f[j+k][i-k]){
sum=f[j][k]*pow(2.0,llmin(k,i-k))+f[j+k][i-k];
}else{
sum=f[j+k][i-k]*pow(2.0,llmin(k,i-k))+f[j][k];
}
f[j][i]=llmax(f[j][i],sum);
}
}
}
ans+=f[1][m];
}
printf("%lld",ans);
return 0;
}
第二组输入:
5 5
0 0 0 0 0
0 0 0 0 1
876 1 566 920 598
259 945 123 659 997
176 478 293 464 278
输出:
118214
我的代码的输出:
123252
蒟蒻求调!