问题描述
设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 <stdio.h>
#include <stdlib.h>
int m[101][101];//前i个数字 分成j段
int a[101];//存放数字
int cal(int a[],int i,int j)
{
int value=0;
while(j>=i)
{
value=value*10+a[i];
i++;
}
return value;
}
int main()
{
FILE *In,*Ou;
int n,k,i,j;
int num;
int max,value;
if((In=fopen("D:\\input.txt","r"))!=NULL)
{
fscanf(In,"%d %d",&n,&k);
fscanf(In,"%d",&num);
int i=n;
while(num)
{
a[i]=num%10;i--;
num/=10;
}
fclose(In);
}
else
{
printf("输入文件打开失败!\n");
}
if(k>=n)
{
printf("划分位数大于等于数字位数 输入不合法\n");
return 0;
}
/*
m[i][j]表示前i个数分成j段的最大乘积
满足最优性原理 重叠子问题
*/
m[1][1]=a[1];
for(i=2;i<=n;i++)
m[i][1]=m[i-1][1]*10+a[i];
for(i=2;i<=k;i++){//分成多少段 统计到k段即可
max=-1;
for(j=i;j<=n;j++){//统计前j个元素分成i段的最大乘积
int d;
for(d=1;d<=j-1;d++){
value=m[d][i-1]*cal(a,d+1,j);//把前d个数分成i-1段再乘上从d+1~j
if(value>max)
max=value;
}
m[j][i]=max;
}
}
if((Ou=fopen("D:\\output.txt","w"))!=NULL)
{
fprintf(Ou,"%d",max);
fclose(Ou);
}
else
{
printf("输出文件打开失败\n");
}
return 0;
}