洛谷1005

主要是想巩固一下高精度

#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1010;
const int bit=1e6;
const int M=101;
int read(){
	char ch=getchar();int k=0,f=1;;
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)){k=(k<<1)+(k<<3)+ch-'0';ch=getchar();}
	return f*k;
}
//注意运算符重载的使用 
struct Bigint{
	int len,a[N];
	inline Bigint operator *(const int &x){
	   Bigint t=(*this);
	   int len=t.len;
	   for(int i=1;i<=len;i++)t.a[i]*=x;
	   for(int i=1;i<=len;i++){
	   	t.a[i+1]+=t.a[i]/bit;t.a[i]%=bit;
	   }
	   if(t.a[len+1]>0)t.len++;
	   return t;
	}
	inline Bigint operator +(const Bigint &x){
		Bigint t=(*this);
		int tl=max(t.len,x.len);
		for(int i=1;i<=tl;i++){
			t.a[i]+=x.a[i];
			t.a[i+1]+=t.a[i]/bit;
			t.a[i]%=bit;
		}
		if(t.a[tl+1]>0)tl++;t.len=tl;
		return t;
	}
	inline Bigint operator =(const int &x){
		len=1;a[1]=x;return *this;
	}
	inline void write(){
		Bigint t=(*this);
		for(int i=t.len;i>0;i--){
			int tmp=bit;
			while(i<len&&tmp>10*t.a[i]){tmp/=10;putchar(48);}//补位0 
			printf("%d",t.a[i]);
		}
	}
}f[M][M],p[M],res;
int n,m,b[M];
inline void checkmax(Bigint &a,Bigint b){
	if(a.len<b.len){a=b;return;}
	else if(a.len!=b.len)return;
	for(int i=a.len;i>0;i--){
		if(a.a[i]<b.a[i]){a=b;return;}
		else if(a.a[i]!=b.a[i])return;
	}
}
inline void dp(){
	for(int i=1;i<=m;i++)
	   for(int j=m;j>=i;j--){
	   	f[i][j].len=0;
	   	Bigint t1=f[i-1][j]+p[m-j+i-1]*b[i-1],t2=f[i][j+1]+p[m-j+i-1]*b[j+1];
	   	checkmax(t2,t1);
	   	checkmax(f[i][j],t2);
	   }
	   Bigint ans;ans=-1;
	   for(int i=1;i<=m;i++){
	   	Bigint t=f[i][i]+p[m]*b[i];
	   	checkmax(ans,t);
	   }
	   res=res+ans;
	   return;
}
int main(){
	p[0]=1;
	for(int i=1;i<=90;i++)p[i]=p[i-1]*2;
	n=read();m=read();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)
		b[j]=read();
		dp();
	}
	res.write();
	return 0;
}

  

原文地址:https://www.cnblogs.com/MikuKnight/p/8871636.html