最大k乘積問題

最大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;
} 




發佈了161 篇原創文章 · 獲贊 70 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章