動態規劃 乘積最大

2021-08-22 10:28:44 字數 1236 閱讀 3666

古人云:「不謀萬世者,不足謀一時;不謀全域性者,不足謀一域。」張琪曼通過研究驚奇地發現,每個人一生的幸福指數可以用乙個長度為n的十進位制數字字串來表示,並且可以通過全域性統籌安排,將幸福指數分成k+1個部分應用在她感興趣的不同領域,從而使得總體幸福值最強,所謂幸福值最強,是指使得k個部分的乘積為最大。例如n=6,k=3,且數字字串為「310143」時,此時可能有的情況有下列各種:

3×1×0×143=0

3×1×01×43=129

3×1×014×3=126

3×10×1×43=1290

3×10×14×3=1260

3×101×4×3=3630

31×0×1×43=0

31×01×4×3=372

310×1×4×3=3720

從上面的結果可以看出,最大乘積為310×1×4×3=3720。

現在的問題時,當n,數字串和k給出之後,找出一種分法使其乘積為最大。

輸入第一行為兩個整數,即n和k, 6≤n≤40,1≤k≤6

第二行為數字字串。

輸出乙個整數,即最大乘積。

樣例輸入

6 3

310143

樣例輸出

3720
初次看到這個題目感覺像普通區間dp,然後發現是稍加變形的類似揹包的問題。

定義dp[i][j]為前i個數插入j個乘號所得到的最大乘積,然後可以得出前i個數的乘積為最後乙個乘號插入位置m之前的dp[m][j-1]乘上最後乙個乘號插入之後的i-m個數組成的整數,由此可得狀態轉移方程dp[i][j]=max(dp[i][j],dp[m][[j-1]*getnum(m,i)),getnum(m,i)為第m個數到第i個數組成的整數。

ac**如下:(不過我後來發現用long long陣列儲存可能在超過1e19的數字後會溢位,但是題目竟然過了,看來題目資料還是比較友好的哈)

#includeusing namespace std;

char s[41];

int num[41];

long long dp[41][7]=;

void chartoint(char s,int num)

return;

}long long getnum(int i,int j)

return thisnum;

}int main()}}

cout

}

《動態規劃》 乘積最大

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

乘積最大 動態規劃

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

乘積最大問題 動態規劃

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