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)
第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[n][k]);
}
return 0;
}
#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[n][k]);
}
return 0;
}