萌新求助简单高精
查看原帖
萌新求助简单高精
119618
MKqwq_楼主2021/1/27 16:53

30pts qwq

#include<bits/stdc++.h>
using namespace std;
int f[81][81][101],ans[101],n,m,a[81][81][101],c[101];
void out(int a[]){
	for(int i=a[0];i>0;i--) cout<<a[i];
	cout<<endl;
}
void out1(int a[]){
	for(int i=a[0]+3;i>=0;i--) cout<<a[i];
	cout<<"..."<<endl;
}
void fz(int a[],int b[]){
	for(int i=0;i<=100;i++) a[i]=b[i];
}
void add(int a[],int b[]){
	if(a[0]==0){
		fz(a,b);
		return;
	}
	for(int i=1;i<b[0];i++){
		a[i]+=b[i];
		if(a[i]>9) a[i+1]++,a[i]-=10;
	}
	a[b[0]]+=b[b[0]];
	
	if(a[b[0]]>9) a[b[0]+1]++,a[0]=max(a[0],b[0]+1),a[b[0]]-=10;
	else a[0]=max(a[0],b[0]);
}
void sm(int a[],int b[]){
	fz(c,a);
	if(c[0]==0){
		fz(c,b);
		return;
	}
	
	for(int i=1;i<b[0];i++){
		c[i]+=b[i];
		if(c[i]>9) c[i+1]++,c[i]-=10;
	}
	c[b[0]]+=b[b[0]];
	if(c[b[0]]>9) c[b[0]+1]++,c[0]=max(c[0],b[0]+1),c[b[0]]-=10;
	else c[0]=max(c[0],b[0]);
}
void tw(int a[]){
	int t[101];
	fz(t,a);
	add(a,t);
}
bool mx(int a[],int b[]){
	if(a[0]>b[0]) return 1;
	else if(a[0]<b[0]) return 0;
	for(int i=a[0];i>0;--i) 
		if(a[i]>b[i]) return 1;
		else if(a[i]<b[i]) return 0;
	return 0; 
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			int x,b[101];
			memset(b,0,sizeof(b));
			cin>>x;
			while(x>0){
				b[++b[0]]=x%10;
				x/=10;
			}
			for(int k=1;k<=b[0];k++) a[i][j][k]=b[k];
			a[i][j][0]=b[0];
			memset(b,0,sizeof(b));
		}
	for(int i=1;i<=n;i++){
		memset(f,0,sizeof(f));
		for(int j=0;j<m;j++)
			for(int k=1;k+j<=m;k++){
				int x[101],y[101];
				memset(x,0,sizeof(x)),memset(y,0,sizeof(y));
				sm(f[k+1][k+j],a[i][k]),fz(x,c);
				sm(f[k][k+j-1],a[i][k+j]),fz(y,c);
				if(mx(x,y)) tw(x),fz(f[k][k+j],x);
				else tw(y),fz(f[k][k+j],y);	
		}
		add(ans,f[1][m]);
	}
	if(ans[0]==0){
		cout<<0;
		return 0;
	}
	for(int i=ans[0];i>0;i--) cout<<ans[i];
	return 0;
}

马蜂清奇,大佬轻喷(((

2021/1/27 16:53
加载中...