最大k乘積問題
阿新 • • 發佈:2020-12-24
最大k乘積問題
問題描述:設X是一個n位十進位制整數,如果將X劃分為K段,則可得到K個整數,這K個整數的乘積稱為X的一個K乘積。請設計演算法並程式設計實現,對於給定的X 和K,求出X的最大K乘積。
輸入:
X,K,n
輸出:
X的最大K乘積。
思路:
m(i,j)——表示第i位到第j位整陣列成的(j-i+1)位整數;
dp(p,q)——表示前p位整數被劃分為q段所得到的最大乘積;
[劃分段數 > 整數位數,則結果為0]
初始子問題:(q=1時)
dp(p,1)=m(1,p)
無論多少位整數,被劃分為一段,其最大k乘積均為其本身。
下一階段子問題:(q>1且q<=p時)
(1<=x<=p-1)
p為整數分為q段,分別求出前x位這個數分為q-1段所得最大乘積與餘下數段的乘積,選擇合適的資料結構記錄,然後進行比較,最大的結果即為dp(p,q)。
思路參考:
思路參考
#include<iostream>
using namespace std;
int x,k,n;
int a[44];
int dp[44][10];//前i個數中間有j個乘號
int m[44][44];
void init(){
for(int i=1;i<= n;i++)
m[i][i]=a[i];
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
m[i][j]=m[i][j-1]*10+m[j][j];
}
}
}
int main(){
cin>>x>>k>>n;
int xx=x;
for(int i=n;i>0;i--){
a[i]=xx%10;
xx=xx/10;
}
init ();
for(int i=1;i<=n;i++)//列舉前i個數字
{
for(int j=0;j<i;j++)//列舉乘號個數
{
if(j==0)
{
dp[i][j]=m[1][i];
continue;
}
for(int k=1;k<i;k++)//列舉乘號位置
{
dp[i][j]=max(dp[i][j],dp[k][j-1]*m[k+1][i]);
}
}
}
cout<<dp[n][k-1]<<endl; //前n個數字分成n段,相當於前面新增n-1個乘號
return 0;
}