dalao们,我的代码除了第一个点全部WA,但是线下实验第二个点答案是正确的,能帮我看一下是什么问题吗?
#include<bits/stdc++.h>
using namespace std;
int ans[40];
int k1[40];
int k2[40];
void add(int* a,int* b){
for(int i=0;i<40;i++){
a[i]=a[i]+b[i];
a[i+1]+=a[i]/10;
a[i]%=10;
}
}
void add(int* a,int b){
a[0]+=b;
for(int i=0;i<4;i++){
a[i+3]+=a[i]/1000;
a[i+2]+=a[i]/100%10;
a[i+1]+=a[i]/10%10;
a[i]%=10;
}
}
bool bigger(int* a,int* b){
for(int i=40;i>=0;i--){
if(a[i]==b[i]){
continue;
}
else if(a[i]>b[i]){
return true;
}
else{
return false;
}
}
return true;
}
void multiple(int* a,int b){
for(int i=0;i<40;i++){
a[i]*=b;
}
for(int i=0;i<36;i++){
a[i+4]+=a[i]/10000;
a[i+3]+=a[i]/1000%10;
a[i+2]+=a[i]/100%10;
a[i+1]+=a[i]/10%10;
a[i]%=10;
}
}
int main(){
memset(ans,0,sizeof(ans));
int n,m;
cin>>n>>m;
int f[m][m][40];
int now[m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>now[j];
}
memset(f,0,sizeof(f));
for(int h=0;h<m;h++){
for(int left=0;left<m-h;left++){
int right=left+h;
if(left==right){
add(f[left][right],now[left]);
}
else{
memset(k1,0,sizeof(k1));
memset(k2,0,sizeof(k2));
for(int g=0;g<40;g++){
k1[g]=f[left+1][right][g];
k2[g]=f[left][right-1][g];
}
multiple(k1,2);
multiple(k2,2);
add(k1,now[left]);
add(k2,now[right]);
if(bigger(k1,k2)){
for(int g=0;g<40;g++){
f[left][right][g]=k1[g];
}
}
else{
for(int g=0;g<40;g++){
f[left][right][g]=k2[g];
}
}
}
}
}
add(ans,f[0][m-1]);
}
multiple(ans,2);
bool flag=false;
for(int i=40;i>=0;i--){
if(flag==false&&ans[i]==0){
continue;
}
else{
flag=true;
cout<<ans[i];
}
}
if(flag==false){
cout<<0;
}
return 0;
}