洛谷 P1018 乘積最大(區間DP)

2021-10-01 07:55:38 字數 843 閱讀 3775

題目大意:

有一串數字,我們要求出怎麼在裡面插入乘號,可以使得總乘積最大。

解題思路:

暴力不可行,這裡我們用區間dp,所謂的區間dp就是狀態裡面包含有區間的端點,然後不斷推。這裡的轉移方程為:

for i l->n-1:

dp[l][k]=max(dp[l][k],dp[i+1][k-1]*no)

其中,dp[l][k]表示左端點在l處時還可以劃分為k段的時候最大乘積是多少。i就是列舉後面的端點。no表示假如這樣列舉導致的新的數是多少。這題需要寫高精度,但是我用python水過去了。這裡用的是py2,大家假如用py3,把裡面的raw_input換為input就可以了。

ls=raw_input().split(" ")

n=int(ls[0])

k=int(ls[1])

k+=1

an=raw_input()

dp=inf=1e100

def dfs(l,k):

if k==1:

return int(an[l:n])

if n-lreturn -inf

if dp[l][k]!=-1:return dp[l][k]

for nx in range(l,n-1):

dp[l][k]=max(dp[l][k],dfs(nx+1,k-1)*int(an[l:nx+1]))

return dp[l][k]

for i in range(n+10):

for j in range(k+10):

dfs(0,k)

print(dp[0][k])

洛谷 P1018 乘積最大

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

洛谷P1018 乘積最大

洛谷p1018 乘積最大 題意 給乙個長度為n的數字串,在這個數字串中插入k個乘號,使得表示式的乘積最大 分析一下 算了,懶得分析了,中有詳細注釋,直接看 吧 君 include using namespace std const int maxn 45 struct biginteger bigi...

洛谷 P1018 乘積最大

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