最大k乘积问题

/***题目内容:

设I是一个n位十进制整数.如果将I划分为k段,则可得到k个整数.这k个整数的乘积称为I的一个k乘积.试设计一个算法,对于给定的I和k ,求出I的最大k乘积.
Input
输入的第1行中有2个正整数n和k.正整数n是序列的长度;正整数k是分割的段数.接下来的一行中是一个n位十进制整数.(n<=10)
Output
输出计算结果,第1行中的数是计算出的最大k乘积.
n位十进制整数.(n<=10)

输入描述

输入的第1行中有2个正整数n和k.正整数n是序列的长度;正整数k是分割的段数.接下来的一行中是一个n位十进制整数.(n<=10)


输出描述

输出计算结果,第1行中的数是计算出的最大k乘积.***/

继续做做回溯的经典例子:

下面是用递推做的,(里面都是for循环枚举)

其中两个二维数组 ,一个数组存储从第几位到第几位的这一串数字,另一个数组储存前i位分成j段  乘积的最大值。

思路是,先把每位到每位的数字存储下来,然后再枚举前i位 ,枚举前位中分成j段,枚举一个乘号的位置来确定最大乘积并存储下来

最后全找前i位分成j段的最大乘积,直接取数就行了。

#include <iostream>
using namespace std;
int dp[100][100];
int m[100][100];

int main(){
    int n, k, a;
    cin >> n >> k >> a;
    if(k == 1){//如果这个数分成一段,就直接输出这个数。
        cout << a;
        return 0;
    }
    int b = 1, q = 1;
    for(int i = n; i >= 1; i--){//
        int p = 10;
        b = a / q;
        q *= 10;
//        cout << b << endl;
        for(int j = i; j >= 1; j--){//从第几位到第几位每段数字是多少全记录下来
            m[j][i] = b % p;
            p *= 10;
//            cout << m[j][i] << " ";
        }
    }
//   dp[1][1] = a;
    for(int i = 1; i <= n; i++){       //枚举前n个数字
        for(int j = 1; j <= i; j++){   //枚举乘号的个数//分成多少段
            if(j == 1){
                dp[i][j] = m[1][i];//前i个分成j段
                continue;
            }
            for(int nn = 1; nn < i; nn++)//枚举乘号的位置
                dp[i][j] = max(dp[i][j], dp[nn][j-1]*m[nn+1][i]);
        }
    }
    cout << dp[n][k];
    return 0;
}

 

posted @ 2019-02-24 10:20  热忱a  阅读(2239)  评论(0编辑  收藏  举报