0分求助
查看原帖
0分求助
649927
JERRYXY楼主2023/1/4 15:04
#include<bits/stdc++.h>
#define N 49

using namespace std;
int n,k,idx=0;
int num[N];
//int dp[N][N],a[N][N];
int a[N][N][N];
int dp[N][N][N];

int main()
{
	//PART 1
	scanf("%d%d",&n,&k);
	char ch;
	while(cin>>ch) num[++idx]=ch-'0';
	//PART 2
	for(int i=1;i<=n;i++)
	{
		for(int j=i;j<=n;j++)
		{
			//a[i][j]=a[i][j-1]*10+num[j];
			a[i][j][1]=num[j];
			for(int m=1;m<=a[i][j-1][0];m++) a[i][j][m+1]=a[i][j-1][m];
			a[i][j][0]=a[i][j-1][0]+1;
		} 
	}
	for(int i=1;i<=n;i++)
	{
		//dp[i][0]=a[1][i];
		for(int j=0;j<=a[1][i][0];j++) dp[i][0][j]=a[1][i][j]; 
	} 
	//PART 3
	for(int len=1;len<=n;len++)
	{
		for(int m=1;m<=k;m++)
		{
			for(int i=1;i<len;i++)
			{
			    //dp[len][m]=max(dp[len][m],dp[i][m-1]*a[i+1][len]);
			    
			    //-----------------------------------
			    //PART 3.1 dp[i][m-1]*a[i+1][len]改为高精度乘法 
				int sum[N][N]={};
				for(int ii=1;ii<=dp[i][m-1][0];ii++)
				{
					for(int jj=1;jj<=dp[i+1][len][0];jj++)
					{
						sum[ii][ii+jj-1]=dp[i][m-1][ii]*dp[i+1][len][jj];
					} 
					for(int jj=1;jj<ii+dp[i+1][len][0];jj++)
					{
						sum[ii][jj+1]+=sum[ii][jj]/10;
						sum[ii][jj]%=10;
					}
				}
				int mum[N]={};//乘后的答案 
				for(int ii=1;ii<=dp[i][m-1][0]+dp[i+1][len][0];ii++)
				{
					long long s=0;
					for(int jj=1;jj<=dp[i+1][len][0];jj++)
					{
						s+=sum[ii][jj];
					}
					mum[ii+1]+=s/10;
					mum[ii]=s%10;
				}
				for(int ii=N-1;ii>=1;ii--)//判断数位 
				{
					if(mum[ii]!=0)
					{
						mum[0]=ii;
						break;
					}
				}
				//PART 3.2 dp[len][m]=max(dp[len][m],   );改为高精度比较,赋值 
				if(mum[0]>dp[len][m][0])
				{
					for(int ii=0;ii<=mum[0];ii++) dp[len][m][ii]=mum[ii];
				}
				else if(mum[0]==dp[len][m][0])
				{
					for(int ii=mum[0];ii>=1;ii--)
					{
						if(mum[ii]>dp[len][m][ii])
						{
							for(int jj=0;jj<=mum[0];jj++) dp[len][m][jj]=mum[jj];
							break;
						}
						else if(mum[ii]<dp[len][m][ii]) break;
					}
				}
				//---------------------------------
			}
		}
	}
	//PART 4
	//printf("%d\n",dp[n][k][0]);
	for(int i=dp[n][k][0];i>=1;i--) printf("%d",dp[n][k][i]);
	return 0;
}   
2023/1/4 15:04
加载中...