P1018 乘積最大

2021-09-08 22:47:50 字數 1579 閱讀 4662

今年是國際數學聯盟確定的「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,1≤k≤6)

第二行是乙個長度為n的數字串。

輸出格式:

結果顯示在螢幕上,相對於輸入,應輸出所求得的最大乘積(乙個自然數)。

輸入樣例#1:

4  2

1231

輸出樣例#1:

62

noip2000提高組第二題

預處理+區間dp,,

還是不太懂為什麼從1開始不行,,

1 #include2 #include3 #include4 #include5

using

namespace

std;

6const

int maxn=41;7

void read(int &n)812

while(c>='

0'&&c<='9'

)13

14 flag==1?n=-x:n=x;15}

16int

n,m;

17int dp[maxn][maxn][maxn];//

區間l to r的最小值

18int

a[maxn];

19int b[maxn][maxn];//

從乙個節點開始向後走x個節點的數

20void

calc()

2128

int m_s(int l,int r,int k)//

pre:前乙個乘號的位置

2939

40for(int i=l;i<=r;i++)

41for(int j=0;j<=k;j++)

42//

dp[l][r][k]=max(m_s(l,i,j)*b[i+1][r-i],dp[l][r][k]);

//在i後面放j個乘號

43 dp[l][r][k]=max(m_s(l,i-1,j)*m_s(i+1,r,k-j),dp[l][r][k]);

44return

dp[l][r][k];45}

46int

main()

47

P1018 乘積最大

今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串,要求選手使用k個乘號將它分成...

P1018 乘積最大

今年是國際數學聯盟確定的 20002000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰9090周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xzxz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為nn的數字串,要求選手使...

P1018乘積最大

今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串,要求選手使用k個乘號將它分成...