1. 程式人生 > 其它 >最大k乘積問題

最大k乘積問題

技術標籤:演算法演算法c++

最大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時)

dp(p,q)=max{dp(x,q-1)*m(x+1,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; }

在這裡插入圖片描述