最大k乘积

来源:互联网 发布:macbook air 屏幕优化 编辑:程序博客网 时间:2024/06/06 18:28

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>using namespace std;#define M 101int m[M][M],w[M][M],a[12];/*w[i][j]是i到j组成的数字m[i][j]表示的是前i个数字分成j段的最大乘积*/int I,n,k;void init(){    int i,j,temp=I;    for (i=n;i>0;i--)    {        a[i]=temp%10;        temp/=10;   //     printf("%d ",a[i]);    }    for (i=1;i<=n;i++)    {        w[i][i]=a[i];      for (j=i+1;j<=n;j++)           w[i][j]=w[i][j-1]*10+a[j];    }//    for (i=1;i<=n;i++)//        for (j=i;j<=n;j++)//        printf("%d ",w[i][j]);//    printf("\n");}int main(){    while (~scanf("%d%d",&I,&k))    {        int i,j,d;        n=log10(I)+1;        init();        memset(m,0,sizeof(m));        for (i=1;i<=n;i++)            m[i][1]=w[1][i];        for (i=2;i<=n;i++)        {            for (j=2;j<=k;j++)            {               for (d=1;d<=i;d++)                if (m[d][j-1]*w[d+1][i]>m[i][j])                {                     m[i][j]=m[d][j-1]*w[d+1][i];       //关键代码               //      printf("%d %d %d %d\n",i,j,m[d][j-1],w[d+1][i]);                }            }        }        printf("%d\n",m[n][k]);    }   return 0;}/*78654 3结果:36624486 2结果:334*/



0 0