最大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; }