今年是國際數學聯盟確定的「 20002000 ――世界數學年」,又恰逢我國著名數學家華羅庚先生誕辰 9090 周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友 xzxz 也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目:
設有乙個長度為 nn 的數字串,要求選手使用 kk 個乘號將它分成 k+1k+1 個部分,找出一種分法,使得這 k+1k+1個部分的乘積能夠為最大。
同時,為了幫助選手能夠正確理解題意,主持人還舉了如下的乙個例子:
有乙個數字串: 312312 , 當 n=3,k=1n=3,k=1 時會有以下兩種分法:
1、 3 \times 12=363×12=36
2、 31 \times 2=6231×2=62
這時,符合題目要求的結果是: 31 \times 2 = 6231×2=62
現在,請你幫助你的好朋友 xzxz 設計乙個程式,求得正確的答案。
輸入格式:
程式的輸入共有兩行:
第一行共有 22 個自然數 n,kn,k ( 6≤n≤40,1≤k≤66≤n≤40,1≤k≤6 )
第二行是乙個長度為 nn 的數字串。
輸出格式:
結果顯示在螢幕上,相對於輸入,應輸出所求得的最大乘積(乙個自然數)。
輸入樣例#1: 複製
4 2輸出樣例#1: 複製1231
62noip2000提高組第二題
思路:先預處理出每個數來,然後動歸。
狀態轉移方程見**。資料範圍較大,需要高精。
#include#include60分**。#include
#include
using
namespace
std;
char x[45
];int
n,m,ans;
long
long dis[45][45],f[45][45
];int
main()
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
dis[i][j]=dis[i][j-1]*10+x[j]-'0'
;
for(int i=1;i<=n;i++) f[i][0]=dis[1
][i];
for(int k=1;k<=m;k++)
for(int i=k+1;i<=n;i++)
for(int j=k;j)
f[i][k]=max(f[i][k],f[j][k-1]*dis[j+1
][i]);
cout
<
9 5945796324
*/
#include#includeusing
namespace
std;
int n,k,a[50
];char s[50
];struct
nodecut[
50][10],ans[50
];node culc(
int l,int
r)
returne;}
node mul(node e1,node e2)
while(q>0
)
return
emul;
}node max(node e1,node e2)
return
e1;}
intmain()
for(int i=1;i)
}if(cut[i][k].exi)
}node lastans;lastans.exi=false
;
for(int i=1;i)
for(int i=lastans.v;i>=1;i--) printf("%d"
,lastans.c[i]);
return0;
}
洛谷 P1018 乘積最大
題目描述 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串,要求選手使用k個乘...
洛谷P1018 乘積最大
洛谷p1018 乘積最大 題意 給乙個長度為n的數字串,在這個數字串中插入k個乘號,使得表示式的乘積最大 分析一下 算了,懶得分析了,中有詳細注釋,直接看 吧 君 include using namespace std const int maxn 45 struct biginteger bigi...
洛谷 P 1018 乘積最大 Codevs
題目描述 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數字串,要求選手使用k個乘...