noip 2000 普及組 第三道
今年是國際數學聯盟確定的「2000——世界數學年」,又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目:
設有乙個長度n的數字串,要求選手使用k個乘號將它分成k+1個部分,找出一種分法,使得這k+1個部分的乘積能夠為最大。
同時,為了幫助選手能夠正確理解題意,主持人還舉了如下的乙個例子:
有乙個數字串: 312,當n=3,k=1時會有以下兩種分法:
1)3*12=36
2)31*2=62
這時,符合題目要求的結果是: 31*2=62
現在,請你幫助你的好朋友xz設計乙個程式,求得正確的答案。
程式的輸入共有兩行:
第一行共有2個自然數n,k (6<=n<=40,0<=k<=5)
第二行是乙個k度為n的數字串。
結果輸出到檔案,相對於輸入,應輸出所求得的最大乘積(乙個自然數)。
4 21231
62
這也算是第一次接觸比較正式的動歸,以前做的完全是純模板的題,沒什麼挑戰性,可是看到這個題,我卻完全懵逼了,一點思路沒有,不知如何下手,聽學長講,看部落格,終於有點眉目了,當你時間超限後你會發現打表是個非常好用的東東,定義乙個陣列用來儲存第a位到第m位的數,舉個栗子,比如987321,a[1][1]=9,a[1][2]=98,a[2][5]=8732,
就是這個意思,儲存好以後,我們最終要求的是n個數的時候中間m個乘號,那麼我們可以求前m-1個乘號的時候可以達到的最大值,m-1個乘號最少也需要m個數,最多可以到n-1個數,我們就從這m到n-1之間選擇乙個最大的,乘以他剩下的還有幾位沒有加上的,這樣一層一層往後計算,就可以找到最大值了。dp陣列表示的意思是:dp[5][3]五個數用三個乘號隔開可以構成的最大數。
#include#include#include#includeusing namespace std;
int num[45][45],dp[45][45];
int main()
for(i=1; i<=n; i++)
for(j=i+1; j<=n; j++)
for(i=1;i<=n;i++)
dp[i][0]=num[1][i];
for(i=1;i<=m;i++)
{for(j=i+1;j<=n;j++)
{for(k=i;k
乘積最大 TYVJ1047 解題報告
program p1047 var n,m longint s string a array 0.40,0.40 of longint 用a表示從首位到末位的數是什麼,例如數為2314,a 2,3 則表示為31 f array 0.40,0.5 of longint 用f i,j 表示前i位用了j個...
TYVJ P1047 乘積最大 Label dp
noip 2000 普及組 第三道 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度n的數...
1017 乘積最大
題目描述 description 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數...