高精求助
查看原帖
高精求助
681292
banglee楼主2024/8/29 14:47

高精度那部分写炸了,有没有人帮我看一下哪错了,谢谢!

#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;
}
2024/8/29 14:47
加载中...