設i是乙個n位十進位制整數。如果將i劃分為k段,則可得到k個整數。這k個整數的乘積稱為i的乙個k乘積。試設計乙個演算法,對於給定的i和k,求出i的最大k乘積。
例如十進位制整數 1234 劃分為 3 段可有如下情形:
1 × 2 × 34 = 68
1 × 23 × 4 = 92
12 × 3 × 4 = 144
證明滿足最優性原理
假設最大k乘積是將前x位劃分為k-1段,再乘以最後的整數。若前x位的劃分不是最優的方法,則其乘積必然小於最優化分方法所得乘積s_max,則其與最後的整數所得結果也並非最大k乘積,與前提矛盾。因此,將前x位劃分為k-1段所得結果比為其最大乘積。
【動態規劃問題中對於最優性原理的證明多採用反證法】
確定動態規劃函式
令number(i,j)表示第i位到第j位整數組成的(j-i+1)位整數;
令product(p,q)表示前p位整數被劃分為q段所得到的最大乘積;
[若劃分段數大於整數字數,則結果為0]
初始子問題:(q=1時)
product(p,1)=number(1,p)
無論多少位整數,被劃分為一段,其最大k乘積均為其本身。
下一階段子問題:(q>1且q<=p時)
product(p,q)=max
(1<=x<=p-1)
p為整數分為q段,分別求出前x位這個數分為q-1段所得最大乘積與餘下數段的乘積,選擇合適的資料結構記錄,然後進行比較,最大的結果即為product(p,q)。
列表
q\p12
3411
12123
123420
236492300
614440
0024第一行 將整數分為一段,結果即為其本身;
第二行product(2,2)=max=2;
product(3,2)=max=max=36;
product(4,2)=max=max=492;
第三行product(3,3)=max=6;
product(4,3)=max=max=144;
第四行product(4,4)=max=24;
q\p3
3131213
3131220
362
#include#includeusing namespace std;
//檔案中輸入的第一行為n k 第二行為整數
//將從文件中所得的數值轉換成陣列儲存
void getnumber(int number[20],int num,int n)
return;
}//求第p到q位整數所代表的數值
int countnumber(int p, int q,int *number)
return newnumber;
}int main()
for (int temp = 0; temp < n; temp++)
for (int i = 0; i < n; i++)//i表列
if (j <= i)
product[j][i] = max;
}} }
cout << "最大k乘積為 " << product[k-1][n-1] << "\n";
f2 << "最大k乘積為 " << product[k - 1][n - 1] << "\n";
f1.close();
f2.close();
return 0;
}
動態規劃之最大K乘積(實驗報告版)
西 安 郵 電 大 學 計算機學院 課內實驗報告 實驗名稱 最大k乘積 專業名稱 電腦科學與技術 班 級 計科1202 學生姓名 學號 8 位 指導教師 實驗日期 2015年5 月12日 1.上機題目及實驗環境 1.1上機題目 最大k乘積問題 1.2實驗環境 作業系統 microsoft windo...
乘積最大問題 動態規劃
洛谷p1018 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串,要求選手使用...
動態規劃 乘積最大
古人云 不謀萬世者,不足謀一時 不謀全域性者,不足謀一域。張琪曼通過研究驚奇地發現,每個人一生的幸福指數可以用乙個長度為n的十進位制數字字串來表示,並且可以通過全域性統籌安排,將幸福指數分成k 1個部分應用在她感興趣的不同領域,從而使得總體幸福值最強,所謂幸福值最強,是指使得k個部分的乘積為最大。例...