帮我看看吧,调了好久了
查看原帖
帮我看看吧,调了好久了
633466
LiaoYF1楼主2022/7/20 12:07
#include <bits/stdc++.h>
//#define int __uint128_t
using namespace std;
struct bigint{
	int num[105]={0},len=1;
	bigint operator*(const bigint b) const{
		bigint c;
		//memset(c.num,0,sizeof(c.num));
		int len3=len+b.len+1;
		for (int i=1;i<=len;i++) {
			for (int j=1;j<=b.len;j++){
				c.num[i + j - 1]+=num[i]*b.num[j];
			}
		}
		/*for (int i=1;i<=len3;i++) {
		  cout<<c.num[i];
		  }
		 */
		for (int i=1;i<=len3;i++) {
			c.num[i + 1]+=c.num[i]/10;
			c.num[i]%=10;
		}
		c.len=len3;
		return c;
	}
	bigint operator+(const int x) const{
		bigint c;
		//memset(c.num,0,sizeof(c.num));
		int len3=100;
		for(int i=1;i<=len3;i++){
			c.num[i]=num[i];
		}
		c.num[1] += x;
		for (int i=1;i<=len3;i++) {
			c.num[i + 1] += c.num[i]/10;
			c.num[i]%=10;
		}
		while(c.num[len3]==0&&len3>1){
			len3--;
		}
		c.len=len3;
		return c;
	}
	bool operator<(const bigint b) const{
		if(len!=b.len){
			return len<b.len;
		}
		for(int i=len;i>=1;i--){
			if(num[i] > b.num[i]) return 0;
			if(num[i] < b.num[i]) return 1;
		}
	}
	bigint operator-(const bigint b) const{
		bigint c;
		//memset(c.num,0,sizeof(c.num));
		int len3=max(len,b.len);
		for (int i=1;i<=len3;i++) {
			c.num[i] = num[i] - b.num[i];
			if (c.num[i] < 0) {
				c.num[i]+=10;
				c.num[i + 1]-=1;
			}
		}
		c.len=len3;
		return c;
	}
};
char print(bigint t) {
	
	while (t.len!=1&&t.num[t.len]==0)t.len--;
	int tlen=t.len;
	while (tlen){
		cout<<t.num[tlen];
		tlen--;
	}
	return '\0';
}
bigint f[45][45];
int s[45];
int n,k;
string s1;
bigint js(int x,int y){
	bigint sum;long long t=1;
	//memset(sum.num,0,sizeof(sum.num));
	
	for(int i=y;i>=x;i--){
		
		sum=sum+s[i]*t;
		t*=10;
	}
	return sum;
}
signed main(){
	cin>>n>>k>>s1;
	for(int i=0;i<s1.length();i++){
		s[i+1]=s1[i]-'0';
	}
	//cout<<s[4]<<endl;
	for(int i=1;i<=n;i++){
		f[0][i]=js(1,i);
		//print(f[0][i]);
		//cout<<" ";
		
	}
	for(int i=1;i<=k;i++){
		for(int j=1;j<=n;j++){
			for(int m=j;m>=i;m--){
				//(f[i-1][l-1]*js(l,j)).print();
				//cout<<js(l,j).len<<" ";
				//cout<<l<<" "<<j<<endl;
				//cout<<" ";
				//cout<<i<<" "<<j<<endl;
				//cout<<print(f[i-1][m-1]*js(m,j))<<" "<<print(f[i][j])<<endl;
				//cout<<print(f[i][j])<<" ";
				f[i][j]=max(f[i][j],f[i-1][m-1]*js(m,j));
				//cout<<print(f[i][j])<<endl;
				//f[i][j].print();
				//cout<<print(f[i][j])<<endl;
				//cout<<"\n";
			}
		}
	}
	//for(int i=1;i<=k;i++){
		//for(int j=1;j<=n;j++){
			//print(f[i][j]);
			//cout<<" ";
		//}
		//cout<<"\n";
	//}
	print(f[k][n]);
	return 0;
}

dp是对的,上次的代码改了一下。

2022/7/20 12:07
加载中...