求助
查看原帖
求助
150611
mrozhx楼主2021/4/11 17:20

我试了5个转移方程,感觉这个最有把握,然而还是WA

#include<bits/stdc++.h>
using namespace std;
const int Mod=10;
int n,m,in[90];
struct Num{
	int x[100],len;
	void inti(int a){
		len=0;
		while(a){
			len++;
			x[len]=a%Mod;
			a/=Mod;
		}
		for(int i=len+1;i<=99;i++) x[i]=0;
	}
	Num friend operator + (Num a,Num b){
		for(int i=1;i<=b.len;i++){
			a.x[i]+=b.x[i];
			a.x[i+1]+=a.x[i]/Mod;
			a.x[i]%=Mod;
			if(a.x[i+1]) a.len=max(a.len,i+1);
		}
		return a;
	}
	Num friend operator * (Num a,Num b){
		Num c;
		c.inti(0);
		c.len=a.len+b.len;
		for(int i=1;i<=a.len;i++){
			for(int j=1;j<=b.len;j++){
				c.x[i+j-1]+=a.x[i]*b.x[j];
				c.x[i+j]+=c.x[i+j-1]/Mod;
				c.x[i+j-1]%=Mod;
			}
		}
		if(!c.x[c.len]) c.len--;
		return c;
	}
	
}p[100],f[100][100],a[100],er,lit,ans;
Num Max(Num a,Num b){
		if(a.len>b.len) return a;
		if(a.len<b.len) return b;
		for(int i=a.len;i>0;i--){
			if(a.x[i]>b.x[i]) return a;
			if(a.x[i]<b.x[i]) return b;
		}
		return a;
}
void print(Num a){
	for(int i=a.len;i>0;i--){
		printf("%d",a.x[i]);
	}
	if(!a.len) printf("0");
	puts("");
}
int main(){
	freopen("in.txt","r",stdin); 
	scanf("%d%d",&n,&m);
	ans.inti(0);
	er.inti(2);
	p[1].inti(2);
	for(int i=2;i<=m;i++){//初始化1<<i
		p[i].inti(0);
		p[i]=p[i-1]*er;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			scanf("%d",&in[j]);
			a[j].inti(in[j]);
		}
		for(int j=0;j<=m;j++){
			for(int k=m+1;k>j;k--){
				f[j][k].inti(0);
				if(j!=0) f[j][k]=Max(f[j][k],p[j+m-k+1]*a[j]+f[j-1][k]);
				if(k!=m+1) f[j][k]=Max(f[j][k],p[j+m-k+1]*a[k]+f[j][k+1]);
			}
		}
//		printf("%d ",i);
//		print(f[1][m+1]);
		lit.inti(0); 
		for(int j=0;j<=m;j++){
			lit=Max(lit,f[j][j+1]);
		}
//		print(lit);
		ans=ans+lit;
	}
	print(ans);
}
2021/4/11 17:20
加载中...