求助
查看原帖
求助
226113
火羽白日生楼主2021/1/12 22:58

如何把一个正整数 NNNN长度 << 2020)划分为MMMM >> 11)个部分,使这MM个部分的乘积最大。NNMM从键盘输入,输出最大值及一种划分方式。

输入数据:

第一行一个正整数TT(TT <=<= 1000010000),表示有TT组数据。

接下来TT行每行两个正整数NNMM

输出数据:

对于每组数据

第一行输出最大值。

第二行输出划分方案,将NN按顺序分成MM个数输出,两个数之间用空格格开。

样例

输入文件:separate.inseparate.in

1
199 2

输出文件:separate.outseparate.out

171
19 9
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <stdlib.h>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
#define int long long

typedef long long ll;
typedef unsigned long long ull;
using namespace std;

inline int read(){
    char ch=getchar();
    int x=0,w=1;
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<3)+(x<<1)+(ch^48);
        ch=getchar();
    }
    return x*w;
}


int T,m,len;
string s;
int a[3005][3005],f[3005][3005],path[3005][3005];//a[i][j]:i->j的数    f[i][j]:前i位划分j次
void work(){
    len=s.size();
    for(int i=0;i<len;i++){
        int sum=0;
        for(int j=i;j<len;j++){
            sum=sum*10+s[j]-'0';
            a[i+1][j+1]=sum;
        }
    }
    for(int i=1;i<=len;i++) f[i][0]=a[1][i];
}
void print(int length,int num){
    if(!num) return;
    print(path[length][num],num-1);
    for(int i=path[length][num]+1;i<=length;i++) cout<<s[i];
    cout<<" ";
}


signed main() {
    T=read();
    while(T--){
        cin>>s;
        m=read();
        work();
        //for(int i=1;i<=len;i++) cout<<a[1][i]<<" ";
        for(int i=2;i<=len;i++)
            for(int j=1;j<=m&&j<i;j++)
                for(int k=1;k<i;k++){
                    //f[i][j]=max(f[i][j],f[k][j-1]*a[k+1][i]);
                    if(f[k][j-1]*a[k+1][i]>f[i][j]){
                        f[i][j]=f[k][j-1]*a[k+1][i];
                        path[i][j]=k;
                    }
        }
        //for(int i=0;i<=m;i++) cout<<f[len][i]<<" ";
        cout<<f[len][m-1]<<"\n";
        //for(int i=0;i<=m;i++) cout<<path[len][i]<<" ";
        print(len,m);
    }
    return 0;
}

求助如何输出方案

2021/1/12 22:58
加载中...