vijos p1347(最大乘积(整数划分?))(25—100分)
跟數(shù)的劃分有些類似,遞歸+記憶化搜索,
做過(guò)數(shù)的劃分的人做這道題目應(yīng)該不是很難。
http://www.cnblogs.com/zyxx233/archive/2012/12/08/2809187.html?這是數(shù)的劃分題解
同樣的,我還是以haha來(lái)作為函數(shù).....(個(gè)人癖好)
狀態(tài):haha(s,t,k).
意思是從s到t的數(shù)段中加入k 個(gè)乘號(hào)所能得到的最大值。
所以 ans:=haha(1,n,k).
狀態(tài)的轉(zhuǎn)移:
for i:=1 to t-k-s+1 do
begin
val(copy(st,s,i),m);
if ha[s+i,t,k-1]<>0 then
haha:=max(haha,m*ha[s+i,t,k-1])
else haha:=max(haha,m*haha(s+i,t,k-1));
end;
當(dāng)k=0時(shí) haha即為該數(shù)段的值。
優(yōu)化:同數(shù)的劃分,遞歸的缺點(diǎn)就是有很多重復(fù)的計(jì)算,所以我們可以另開(kāi)一個(gè)三維數(shù)組來(lái)記錄每一次函數(shù)的值,如果再需計(jì)算這個(gè)函數(shù),我們先檢查這個(gè)函數(shù)是否已經(jīng)在數(shù)組里記錄過(guò)了,如
果已經(jīng)記錄,直接調(diào)用數(shù)組,否則再計(jì)算函數(shù)。
1 program p1347; uses math;2 var3 i,j,k,l,m,n,ans:longint;4 st:string;5 ha:array[0..60,0..60,0..6]of int64;6 function haha(s,t,k:longint):int64;7 var8 m,n:int64;9 i,j:longint; 10 begin 11 haha:=0; 12 if k<=0 then 13 begin 14 val(copy(st,s,t-s+1),m); 15 haha:=m; 16 end 17 //else if k<0 then exit(0) 18 else if k>0 then 19 for i:=1 to t-k-s+1 do 20 begin 21 val(copy(st,s,i),m); 22 if ha[s+i,t,k-1]<>0 then 23 haha:=max(haha,m*ha[s+i,t,k-1]) 24 else haha:=max(haha,m*haha(s+i,t,k-1)); 25 end; 26 ha[s,t,k]:=haha; 27 end; 28 begin 29 assign(input,'p1347.in'); 30 reset(input); 31 readln(n,k); 32 readln(st); 33 ans:=haha(1,n,k); 34 write(ans); 35 close(input); 36 end.今天的題解終于寫(xiě)完了!
轉(zhuǎn)載于:https://www.cnblogs.com/zyxx233/archive/2012/12/08/2809245.html
總結(jié)
以上是生活随笔為你收集整理的vijos p1347(最大乘积(整数划分?))(25—100分)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C专家编程复习摘要一
- 下一篇: 将字符串中的大写字母变成小写字母