算法 最大k乘积问题

来源:互联网 发布:手机照相优化算法 编辑:程序博客网 时间:2024/05/17 22:03

题目

设I是一个n位十进制整数。如果将I分割为k段,则可得到k个整数。这k个整数的乘积称为I的一个k乘积。
试设计一个算法,对于给定的I和k,求出I的最大k乘积。


分析

设w[i][j]表示从第i位到第j位的数字表示的整数,m[i][j]表示前i位分成j段所得到的最大乘积,则:
m[i][1]=w[1][i]
m[i][j]=max{ m[d][j-1] * w[d+1][i] } 其中1<=d<=i


#include <stdio.h>#include <stdlib.h>#define  MAX  10int m[MAX][MAX];int w[MAX][MAX];void suanfa(int *a,int n,int k){    int i,j,d,max,temp;    for(i=1; i<=n; i++){        m[i][1] = w[1][i];//前i位分成1段,就是从1到i位的整数。    }    for(i=1; i<=n; i++){        for(j=2; j<=k; j++){            max = 0;            for(d=1; d<i; d++){//从1~i取最大的给max                temp=m[d][j-1]*w[d+1][i];                if(temp>max){                    max=temp;                }                m[i][j]=max;            }        }    }}void init(int *a,int n){    int i,j;    for(i=1; i<=n; i++){//从1开始        w[i][i]=a[i]; //第i位表示的整数        for(j=i+1; j<=n; j++){            w[i][j] = w[i][j-1]*10+a[j];//第i~j位表示的整数 = 第i~j-1位表示的整数x10 + 第j位整数        }    }}int main(){    int  n=3;//这个数是n位的    int  k=2;//把这个数分成分成k段    int  a[MAX]={0,1,3,4};//这个数134,结果:52    init(a,n);    suanfa(a,n,k);    printf("%d\n",m[n][k]);//打印n位分成k段的最大k乘积    return 0;}
0 0
原创粉丝点击