10pts求调
查看原帖
10pts求调
520291
bktchizhi_fzh楼主2022/9/28 10:10
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m;
char s[5];
struct shu{
	int c[100],len;
	shu(){
		memset(c,0,sizeof(c));
		len=0;
	}
}dp[82][82],a[82][82],pow[82],base,ans;
shu operator*(const shu &x,const shu &y){
	shu z;
	for(int i=1;i<=y.len;i++){
		for(int j=1;j<=x.len;j++){
			z.c[i+j-1]+=x.c[j]*y.c[i];
		}
	}
	z.len=y.len+x.len-1;
	for(int i=1;i<=z.len;i++){
		z.c[i+1]+=z.c[i]/10;
		z.c[i]%=10;
	}
	if(z.c[z.len+1])z.len++;
	return z;
}
shu operator+(const shu &x,const shu &y){
	shu z;
	z.len=max(z.len,y.len);
	for(int i=1;i<=z.len;i++)
		z.c[i]=y.c[i]+x.c[i];
	for(int i=1;i<=z.len;i++){
		z.c[i+1]+=z.c[i]/10;
		z.c[i]=z.c[i]%10;
	}
	if(z.c[z.len+1])z.len++;
	while(z.c[z.len ]==0&&z.len>1)z.len--;
	return z;
}
shu Max(shu a,shu b){
	if(a.len>b.len)return a;
	if(a.len<b.len)return b;
	for(int i=a.len;i>=1;i--){
		if(a.c[i]>b.c[i])return a;
		if(a.c[i]<b.c[i])return b;
	}
	return a;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%s",s);
			int len=strlen(s);
			for(int k=1;k<=len;k++)
				a[i][j].c[k]=s[len-k]-'0';
			a[i][j].len=len;
		}
	}
	base.c[1]=2;base.len=1;
	pow[1].c[1]=2;pow[1].len=1;
	for(int i=2;i<=m;i++)pow[i]=pow[i-1]*base;
	for(int i=1;i<=n;i++){
		memset(dp,0,sizeof(dp));
		for(int len=m;len>=1;len--){
			for(int l=1;l+len-1<=m;l++){
				int r=l+len-1;
				dp[l][r]=Max(dp[l][r],dp[l-1][r]+a[i][l-1]*pow[m-(r-l)-1]);
				dp[l][r]=Max(dp[l][r],dp[l][r+1]+a[i][r+1]*pow[m-(r-l)-1]);
			}
		}
		shu maxx;
		for(int j=1;j<=m;j++){
			maxx=Max(maxx,dp[j][j]+pow[m]*a[i][j]);
		}
		ans=ans+maxx;
	}
	for(int i=ans.len;i>=1;i--)printf("%d",ans.c[i]);
	return 0;
}
2022/9/28 10:10
加载中...