今年是國際數學聯盟確定的「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 21231
輸出樣例#1:
62
noip2000提高組第二題
預處理+區間dp,,
還是不太懂為什麼從1開始不行,,
1 #include2 #include3 #include4 #include5using
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個乘號將它分成...