样例美国,wa50求条
查看原帖
样例美国,wa50求条
758264
Motonic_queues楼主2024/11/20 10:54

悬2关,[record] (https://www.luogu.com.cn/record/189914854)

#include<bits/stdc++.h>
#define int long long
using namespace std;

struct BI{
	int num[505],ll;
	BI(){
		memset(num,0,sizeof num);
		ll=0;
	}
	void debug(){
		for(int i=1;i<=ll;i++){
			if(num[i]>=1000){
				int p=num[i]%1000,k=num[i]/1000;
				num[i]=p;
				num[i+1]+=k;
				if(i==ll)ll++;
			}
		}
	}
	BI(int k){
		num[1]=k;ll=1;
		debug();
	}
	BI operator+(const BI b)const{
		BI res;
		res.ll=max(ll,b.ll);
		for(int i=1;i<=res.ll;i++)
			res.num[i]=num[i]+b.num[i];
		res.debug();
		return res;
	}
	BI operator*(const int b)const{
		BI res;
		res.ll=ll;
		for(int i=1;i<=res.ll;i++)
			res.num[i]=num[i]*b;
		res.debug();
		return res;
	}
	void WoW(){
		cout<<num[ll];
		for(int i=ll-1;i>=1;i--){
			printf("%03d",num[i]);
		}
	}
};

BI max(BI a,BI b){
	if(a.ll!=b.ll)return a.ll<b.ll?b:a;
	for(int i=a.ll;i>=1;i--)
		if(a.num[i]!=b.num[i])
			return a.num[i]<b.num[i]?b:a;
	return a;
}

int n,m;
long long line[100][100];
BI dp[100][100],pow2[100];
BI ans;

signed main(){
	cin>>n>>m;
	pow2[0]=1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>line[i][j];
	for(int i=1;i<=m;i++){
		pow2[i]=pow2[i-1]*2;
	}
	for(int i=1;i<=n;i++){
		memset(dp,0,sizeof dp);
		BI afl;
		for(int l=1;l<=m;l++){
			for(int r=m;r>=l;r--){
				dp[l][r]=max(dp[l][r],dp[l-1][r]+pow2[m-r+l-1]*line[i][l-1]);
				dp[l][r]=max(dp[l][r],dp[l][r+1]+pow2[m-r+l-1]*line[i][r+1]);
			}
		}
		for(int l=1;l<=m;l++){
			afl=max(afl,dp[l][l]+pow2[m]*line[i][l]);
		}
		ans=ans+afl;
	}
	ans.WoW();
	return 0;
}
2024/11/20 10:54
加载中...