计算机算法设计与分析 3-13最大K乘积问题

3-13 最大乘积问题

问题描述:设I是一个N位的十进制整数,如果将I划分为K段,则可得到K个整数,这K个整数的乘积称为I的一个K乘积,设计一个算法,对于给定的IK,求出I的最大值乘积。

算法设计:对于给定的IK,就算I的最大K乘积

算法输入: 第一行中有两个整数nk。整数n是序列的长度,正整数k是分割的段数,接下来的一行是一个n位十进制整数(n<=10

输出结果:第一行中的数式计算出的最大k乘积。

  Input         output

 2,1           15

15

 

 

代码:

#include<iostream>  
using namespace std;  
#define N 20  
int m[N][N];  
char num[N];  
  
int atoi(char arr[],int i,int j)  
{  
    int sum=0;  
    while(i<=j)  
    {  
        sum = sum*10+arr[i]-'0';  //此处本来用了函数pow,然后wa了,一直找不到错在何处,  
        i++;        //后来问师兄,才发现原来pow(double,int)   
    }             //的参数double会使结果又偏差,改掉后就ac了  
    return sum;  
}  
  
int main()  
{  
    int n,k,i,j,l,max,flag;  
    while(cin>>n>>k)  
    {  
        for(i=1;i<=n;i++)  
            cin>>num[i];  
        m[1][1]=num[1]-'0';  
        for(i=2;i<=n;i++)  
            m[i][1]=m[i-1][1]*10+(num[i]-'0'); //初始化第一列  
        for(j=2;j<=k;j++)//按列进行初始化  
        {  
            max=-1;  
            for(i=1;i<=n;i++)  
            {  
                if(j>i)  
                    m[i][j]=0;  
                else  
                {  
                    for(l=j-1;l<=i-1;l++)  
                    {  
                        flag=m[l][j-1]*atoi(num,l+1,i);  
                        if(flag>max)  
                        max=flag;  
                    }  
                    m[i][j]=max;  
                }  
            }  
        }  
        cout<<m[n][k]<<endl;  
    }  
    return 0;  
}  

 

运行截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值