您的位置:首页 > 其它

FZU_1208_最大k乘积问题

2015-08-01 08:47 423 查看

Time Limit: 1000 mSec Memory Limit : 32768 KB



Problem Description

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

对于给定的I和k,编程计算I的最大k乘积。



Input

输入文件由多组数据组成。每组数据格式如下:

第1行中有2个正整数n和k。正整数n是序列的长度;正整数k是分割的断数。

接下来的一行中是一个n位十进制整数。(n<=10)



Output

对于每组数据,输出计算出的最大k乘积。


Sample Input

2 115



Sample Output

15

w[i][j]表示从第i位到第j位可以得到的数,,m[i][j]表示l取到第i位,已经分了j段的最优解

m[i][j]=m[d][j-1]*m[d+1][i] 1<d<i

#include <iostream>

#include <stdio.h>

#include <string.h>

using namespace std;

int n,k;

char a[12];

long long w[20][20],m[20][20];

void call(int n)

{

long long temp=0;

for(int i=1;i<=n;i++) w[i][i]=a[i]-'0';

for(int j=1;j<=n;j++)

{

w[1][j]=a[j]-'0'+temp;

temp+=a[j]-'0';

temp*=10;

}

long long cmp=0;

for(int i=2;i<=n;i++)

{

cmp=a[i]-'0';cmp*=10;

for(int j=i+1;j<=n;j++)

{

w[i][j]=a[j]-'0'+cmp;

cmp+=a[j]-'0';

cmp*=10;

}

}

/* for(int i=1 ; i<= n; i++)

{

for(int j=1 ; j<= n; j++)

printf("%d ",w[i][j]);

printf(" ");

}*/

}

void dp(int n)

{

long long lar;

for(int i=1;i<=n;i++) m[i][1]=w[1][i];

for(int i=1;i<=n;i++)

{

for(int j=2;j<=k;j++)

{

lar=0;

for(int d=1;d<i;d++)

{

if(m[d][j-1]*w[d+1][i]>lar)

lar=m[d][j-1]*w[d+1][i];

m[i][j]=lar;

}

}

}

}

int main()

{

freopen("1.in","r",stdin);

while(scanf("%d%d",&n,&k)!=EOF)

{

memset(w,0,sizeof(w));

memset(m,0,sizeof(m));

scanf("%s",a+1);

call(n);

dp(n);

printf("%I64d\n",m
[k]);

}

return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: