划分(较正常算法)
  • 板块灌水区
  • 楼主lin_xin
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/12/27 17:28
  • 上次更新2023/10/28 13:29:18
查看原帖
划分(较正常算法)
511610
lin_xin楼主2021/12/27 17:28
#include<bits/stdc++.h>
#define ni 1005
using namespace std;
long long n,m,t,f[ni][ni],son[ni][ni];
string a;
long long s[ni][ni];
void find(int n,int m)
{
   	if(!m) return;
    else
       	find(son[n][m],m-1);
    for(int i=son[n][m];i<n;i++)
     	cout<<a[i];
    	cout<<" ";
    return;	
}
int main()
{
	/*
	1
	29962086110065 5
	9692024940000
	2 9 9620 861100 65 
	1
	6765826696162781268 12
	2056931328
	6 7 6 5 8 2 6 6 9 61 6278 1268 
	*/
	cin>>t;
	while(t--)
	{
		int m,s1[ni];
		memset(s,0,sizeof(s));
        memset(f,0,sizeof(f));
        memset(s1,0,sizeof(s1));
		cin>>a>>m;
		n=a.size();
		for(int i=0;i<n;i++)
			s1[i+1]=a[i]-'0';
		for(int i=1;i<=n;i++)
		{
    	  	s[i][i]=s1[i];
   		   	for(int j=i+1;j<=n;j++)
        	s[i][j]=s[i][j-1]*10+s1[j]; 
		} 
  	  	for(int i=1;i<=n;i++)
			f[i][1]=s[1][i];
		/*	for(int i=1;i<=n;i++)
			{
			cout<<endl;
			for(int j=1;j<=n;j++)
			cout<<s[i][j]<<" ";
		}*/
		for(int i=2;i<=n;i++)
			for(int j=2;j<=m;j++)
				for(int k=1;k<i;k++)
				{
					if(f[i][j]<f[k][j-1]*s[k+1][i])
					{
						f[i][j]=f[k][j-1]*s[k+1][i];
						son[i][j]=k;	
					}
				}
		cout<<f[n][m]<<endl;
		find(n,m);    
		cout<<endl; 
	}
}
2021/12/27 17:28
加载中...