玄关,求调
查看原帖
玄关,求调
1269423
huge_wave楼主2025/1/3 18:51
#include<bits/stdc++.h>
using namespace std;
struct INT{
	int len;
	bool f;
	int a[100];
	INT(string s=" "){
		memset(a,0,sizeof a);
		len=0;	
		f=0;
		if(s!=" "){
			len=s.size();
			
			if(s[0]=='-'){
				f=1;
				len--;
			}
			else{
				s=" "+s;
			}
			for(int i=len;i>=1;i--){
				a[len-i+1]=(int(s[i]-'0'));
			}
		}
	}
	int &operator[](int i){
		return a[i];
	}
	void ll(){
		while(len>=2&&a[len]==0){
			a[len]=0;
			len--;
		}
	}
	void print(){
		ll();
		if(a[len]==0){
			cout<<0;
		}
		else{
			if(f){
				cout<<'-';
			}
//			cout<<len<<"a";
			for(int i=len;i>=1;i--){
				cout<<a[i];
			}
		}
		
	}
	
};
INT operator+(INT a,INT b){
	int N=max(a.len,b.len)+1;
	for(int i=1;i<=N;i++){
		a[i]+=b[i];
		a[i+1]+=a[i]/10;
		a[i]%=10;
	}
	a.len=N;
	a.ll();
	return a;
}
INT operator*(INT a,INT b){
	INT c(" ");
	c.f=(a.f!=b.f);
	int N=a.len+b.len;
	const int &n=a.len;
	const int &m=b.len;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			c[i+j-1]+=a[i]*b[j];
			c[i+j]+=c[i+j-1]/10;
			c[i+j-1]%=10;
		}
	}
	c.len=N;
	c.ll();
	return c;
}
INT operator+(INT a,int b){
	a[1]+=b;
	a[2]+=a[1]/10;
	a[1]%=10;
	for(int i=2;i<=a.len;i++){
		a[i]+=b;
		a[i+1]+=a[i]/10;
		a[i]%=10;
	}
//	a.len=N;
	a.ll();
	return a;
}
bool operator<(INT a,INT b){
	if(a.f!=b.f){
		if(a.f){
			return 1;
		}
		return 0;
	}
	if(a.f==1){
		if(a.len==b.len){
			for(int i=a.len;i>=1;i--){
				if(a[i]>b[i]){
					return 1;
				}
			}
			return 0;
		}
		return a.len>b.len;
	}
	else{
		if(a.len==b.len){
			for(int i=a.len;i>=1;i--){
				if(a[i]<b[i]){
					return 1;
				}
			}
			return 0;
		}
		return a.len<b.len;
	}
	
}
INT dp[50][50][10];
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	INT s10("10");
//	INT xx;
	int n,k;
	string x;
	cin>>n>>k>>x;
	INT xx(x);
	xx.print();
	cout<<"\n";
	k++;
	for(int len=1;len<=n;len++){
		for(int i=1;i<=n;i++){
			int j=i+len-1;
			if(j>n){
				break;
			}
			for(int kk=1;kk<=min(len,k);kk++){
//				if()
				if(kk==1){
					dp[i][j][kk]=dp[i][j-1][1]*s10+xx[j];
					
				}
				else{
					for(int l=i;l<j;l++){
						for(int k1=1;k1<kk;k1++){
							dp[i][j][kk]=max(dp[i][j][kk],dp[i][l][k1]*dp[l+1][j][kk-k1]);
						}
					}
				}
				dp[i][j][kk].print();
				cout<<"\n";
			}
		}
	}
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=n;j++){
//			cout<<dp[i][j][1]<<' ';
//		}
//		cout<<"\n";
//	}
	dp[1][n][k].print();
//	cout<<dp[1][n][k];
	return 0;
}
2025/1/3 18:51
加载中...