i.最大K乘积问题
问题描述
设I是一个n位十进制整数。如果将I划分为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。试设计一个算法,对于给定的I和k,求出I的最大k乘积。
例如十进制整数 1234 划分为 3 段可有如下情形:
1 × 2 × 34 = 68
1 × 23 × 4 = 92
12 × 3 × 4 = 144
编程任务
对于给定的I 和k,编程计算I 的最大k 乘积。
数据输入
输入的第1 行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的段数。接下来的一行中是一个n位十进制整数。(n<=10)
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int ans[1000][1000];
void getAns(int n,int k,int num){
ans[2][1]=num/(int(pow(10,n-2)));
ans[1][1]=num/(int(pow(10,n-1)));
for(int i=2;i<=n;i++){//数长度为i
int num1=num/(int(pow(10,n-i)));
for(int j=2;j<=i&&j<=k;j++){//分为j段,依次填表
int m=-1;//假设为最小
for(int b=i-1;b>=1&&b>=j-1;b--){//转移方程:ans[i][j]=max(ans[p][j-1]),1<=p<=i-1;
m=max(ans[b][j-1]*(num1%(int(pow(10,i-b)))),m);
}
ans[i][j]=m;
}
}
}
int main(){
int n,k,num;
scanf("%d%d%d",&n,&k,&num);//n>1,1<k<=n
memset(ans,0,sizeof(ans));//置零
getAns(n,k,num);
printf("%d\n",ans[n][k]);//输出长度为n,分为k端的最大k乘积
return 0;
}