代码是针对 P1005 写的,高精度那部分写炸了,有没有人帮我看一下哪错了,谢谢!
#include<bits/stdc++.h>
using namespace std;
struct bign{
int len,s[1005];
bign() {memset(s,0,sizeof(s)); len=1;}
bign(int num) {*this=num;}
bign(char *num) {*this=num;}
bign operator =(int num){
char c[1005];
sprintf(c,"%d",num);
*this=c;
return *this;
}
bign operator =(const char *num){
len=strlen(num);
for(int i=0;i<len;i++)
s[i]=num[len-1-i]-'0';
return *this;
}
string str(){
string res="";
for(int i=0;i<len;i++)
res=(char)(s[i]+'0')+res;
return res;
}
void clean(){
while(len>1 && !s[len-1])
len--;
}
bign operator +(const bign &b){
bign c;
c.len=0;
for(int i=0,g=0;g || i<len || i<b.len;i++)
{
int x=g;
if(i<len) x+=s[i];
if(i<b.len) x+=b.s[i];
c.s[c.len++]=x%10,g=x/10;
}
return c;
}
bign operator -(const bign &b){
bign c;
c.len=0;
int x;
for(int i=0,g=0;i<len;i++)
{
x=s[i]-g;
if(i<b.len) x-=b.s[i];
if(x>=0) g=0;
else{
x+=10;
g=1;
};
c.s[c.len++]=x;
}
c.clean();
return c;
}
bign operator *(const bign &b){
bign c;
c.len=len+b.len;
for(int i=0;i<len;i++)
for(int j=0;j<b.len;j++)
c.s[i+j]+=s[i]*b.s[j];
for(int i=0;i<c.len-1;i++)
c.s[i+1]+=c.s[i]/10,c.s[i]%=10;
c.clean();
return c;
}
bool operator <(const bign &b){
if(len!=b.len) return len<b.len;
for(int i=len-1;i>=0;i--)
if(s[i]!=b.s[i]) return s[i]<b.s[i];
return false;
}
bool operator >(const bign &b){
if(len!=b.len) return len>b.len;
for(int i=len-1;i>=0;i--)
if(s[i]!=b.s[i]) return s[i]>b.s[i];
return false;
}
bign operator +=(const bign &b){
*this=*this+b;
return *this;
}
bign operator -=(const bign &b){
*this=*this-b;
return *this;
}
};
istream& operator >>(istream &in,bign &x){
string s;
in>>s;
x=s.c_str();
return in;
}
ostream& operator <<(ostream &out,bign &x){
out<<x.str();
return out;
}
int n,m;
bign ans,a[1005],f[1005][1005],pre[1005];
int main(){
cin>>n>>m;
pre[0]=1;
for(int i=1;i<=m;i++)
pre[i]=pre[i-1]*2;
for(int i=1;i<=n;i++)
{
memset(f,0,sizeof(f));
for(int j=1;j<=m;j++)
cin>>a[j];
for(int j=1;j<=m;j++)
for(int k=m;k>=j;k--)
{
if(f[j-1][k]+pre[m+j-k-1]*a[j-1]>f[j][k]) f[j][k]=f[j-1][k]+pre[m+j-k-1]*a[j-1];
if(f[j][k+1]+pre[m+j-k-1]*a[k+1]>f[j][k]) f[j][k]=f[j][k+1]+pre[m+j-k-1]*a[k+1];
}
bign maxl=0;
for(int j=1;j<=m;j++)
maxl=max(maxl,f[j][j]+pre[m]*a[j]);
ans+=maxl;
}
cout<<ans;
return 0;
}