zoukankan      html  css  js  c++  java
  • 洛谷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;
    }
    

      

  • 相关阅读:
    SQL Server(00):分析函数
    SQL Server(00):序列SEQUENCE
    .NET Standard 、.NET Core、 .NET Framework的区别
    电脑音频播放器 foobar2000
    JavaScript:highcharts图表
    SQL Server(00):带有OUTPUT的INSERT,DELETE,UPDATE
    [开发笔记]-js判断用户的浏览设备是移动设备还是PC
    [开发笔记]-获取天气数据接口
    [开发笔记]-控制Windows Service服务运行
    C#程序调用cmd执行命令
  • 原文地址:https://www.cnblogs.com/MikuKnight/p/8871636.html
Copyright © 2011-2022 走看看