最大k乘積問題
設I是一個n位十進制整數。如果將I分割爲k段,則可得到k個整數。這k個整數的乘積稱爲I的一個k乘積。試設計一個算法,對於給定的I和k,求出I的最大k乘積。
樣例輸入
54321 5
6420
解:
最大k乘積問題:
首先將給給定的數字I分割放到數組a[i]中
定義數組w[i][j]存放i到j所代表的整數,在init中(第一位下標從1開始)進行賦值
定義dp[i][j] 前i個數分成j段的最大乘積所以dp[i][1]=w[1][1]
在動態規劃過程中 將要將前i個數字分割成j段,則將前d個數字分成j-1段,將最後i-d個數字作爲一段
兩段的乘積作爲前i個數字分割成j段的乘積,從中選取最大值作爲dp[i][j]的值
此時 d個數字分成j-1段爲:dp[d][j-1], 將最後i-d個數字作爲一段爲:w[d+1][i](即從d+1到i所代表的數)
即: dp[i][j]=max{dp[d][j-1]*w[d+1][i]}
#include <stdio.h>
#include <math.h>
#define MAX(a,b) a>b?a:b
int w[100][100]; //存放i到j代表的整數
int dp[100][100]; //前i個數分成j段的最大乘積
void init(int I,int len)
{
int a[100]={0};
int index=len;
while(I){
a[index--]=I%10;
I/=10;
}
for(int i=1;i<=len;i++)
{
for(int j=i;j<=len;j++)
{
int temp=0;
for(int k=i;k<=j;k++)
{
temp=temp*10+a[k];
}
w[i][j]=temp;
}
}
for(int i=1;i<=len;i++)
{
dp[i][1]=w[1][i];
}
}
//dp[i][1]=w[1][i]
//dp[i][j]=max{dp[d][j-1]*w[d+1][i]}
int main()
{
int I,k;
scanf("%d %d",&I,&k);
int len=log10(I)+1;
init(I,len);
for(int i=1;i<=len;i++)
{
for(int j=2;j<=k;j++)
{
int maxvalue=0;
for(int d=1;d<i;d++)
{
int temp=dp[d][j-1]*w[d+1][i];
maxvalue=MAX(maxvalue,temp);
}
dp[i][j]=maxvalue;
}
}
printf("%d\n",dp[len][k]);
return 0;
}