11屆國(guó)賽python試題 J: 藍(lán)跳跳

藍(lán)跳跳(動(dòng)態(tài)規(guī)劃)


【問(wèn)題描述】
小藍(lán)制作了一個(gè)機(jī)器人,取名為藍(lán)跳跳览绿,因?yàn)檫@個(gè)機(jī)器人走路的時(shí)候基本靠跳躍。
藍(lán)跳跳可以跳著走穗慕,也可以掉頭饿敲。藍(lán)跳跳每步跳的距離都必須是整數(shù),每步可以跳不超過(guò) k 的長(zhǎng)度逛绵。由于藍(lán)跳跳的平衡性設(shè)計(jì)得不太好怀各,如果連續(xù)兩次都是跳躍倔韭,而且兩次跳躍的距離都至少是 p,則藍(lán)跳跳會(huì)摔倒瓢对,這是小藍(lán)不愿意看到的寿酌。
小藍(lán)接到一個(gè)特別的任務(wù),要在一個(gè)長(zhǎng)為 L 舞臺(tái)上展示藍(lán)跳跳沥曹。小藍(lán)要控制藍(lán)跳跳從舞臺(tái)的左邊走到右邊份名,然后掉頭,然后從右邊走到左邊妓美,然后掉頭僵腺,然后再?gòu)淖筮呑叩接疫叄缓蟮纛^壶栋,再?gòu)挠疫呑叩阶筮叧饺纾缓蟮纛^,如此往復(fù)贵试。為了讓觀者不至于太無(wú)趣琉兜,小藍(lán)決定讓藍(lán)跳跳每次用不同的方式來(lái)走。小藍(lán)將藍(lán)跳跳每一步跳的距離記錄下來(lái),按順序排成一列,顯然這一列數(shù)每個(gè)都不超過(guò) k 且和是 L驶俊。這樣走一趟就會(huì)出來(lái)一列數(shù)。如果兩列數(shù)的長(zhǎng)度不同梧疲,或者兩列數(shù)中存在一個(gè)位置數(shù)值不同,就認(rèn)為是不同的方案运准。
請(qǐng)問(wèn)藍(lán)跳跳在不摔倒的前提下幌氮,有多少種不同的方案從舞臺(tái)一邊走到另一邊。
【輸入格式】
輸入一行包含三個(gè)整數(shù) k, p, L胁澳。
【輸出格式】
輸出一個(gè)整數(shù)该互,表示答案。答案可能很大韭畸,請(qǐng)輸出答案除以 20201114 的余數(shù)宇智。
【樣例輸入】
3 2 5
【樣例輸出】
9
【樣例說(shuō)明】
藍(lán)跳跳有以下 9 種跳法:
1+1+1+1+1
1+1+1+2
1+1+2+1
1+2+1+1
2+1+1+1
2+1+2
1+1+3
1+3+1
3+1+1
【樣例輸入】
5 3 10
【樣例輸出】
397

方法一

思路:

這種題可以用遞歸的DFS解也可以用動(dòng)態(tài)規(guī)劃,相比較經(jīng)典的遞歸走臺(tái)階問(wèn)題胰丁,由于題目沒(méi)有限定第一步跳的種類普筹,所有導(dǎo)致有多種方法。遞歸之后也是無(wú)法求解;遞歸無(wú)法求解的題目隘马。因?yàn)橹貜?fù)計(jì)算。計(jì)算規(guī)模o(L的k次方)妻顶,所以采用了動(dòng)態(tài)規(guī)劃+遞推做的此題酸员,我們可以建立一個(gè)2維數(shù)組dp[i][j] 蜒车。
i 表示舞臺(tái)距離,j表示第一次跳j格時(shí)幔嗦。 dp[i][j]表示我當(dāng)前步數(shù)用j步走 可以多少種方法走到i酿愧。
p意思就是連續(xù)跳大于等于p時(shí)就會(huì)摔倒。
d[i][j]i跳數(shù)的取值范圍0-K
j的取值范圍是0-L
規(guī)律描述:當(dāng)舞臺(tái)長(zhǎng)度為1時(shí)邀泉,我第一步為1時(shí)dp[1][1]=1 種方法 當(dāng)?shù)谝徊綖?時(shí) d[1][2]=0種嬉挡。當(dāng)?shù)谝徊綖?時(shí)dp[1][3]=0種。
當(dāng)舞臺(tái)長(zhǎng)度為2時(shí)汇恤,我第一步為1時(shí)dp[2][1]=1種方法 當(dāng)?shù)谝徊綖?時(shí)dp[2][2]=1種庞钢。當(dāng)?shù)谝徊綖?時(shí)dp[2][3]=0種.
當(dāng)我們得到長(zhǎng)度為2 第一步為1時(shí), 我當(dāng)前的長(zhǎng)度減1 剩余舞臺(tái)長(zhǎng)度為1因谎,我們可以看到舞臺(tái)為1的時(shí)候一共只有1種方法那么當(dāng)長(zhǎng)度為dp[1][1]+dp[1][2]+dp[1][3]=dp[2][1]=1 第一步為1時(shí)就是一種方法基括。因?yàn)楫?dāng)跳的步數(shù)和長(zhǎng)度相等的時(shí)候只有一種方法 dp[2][2]=1。


圖一

如果連續(xù)兩次都是跳躍财岔,而且兩次跳躍的距離都至少是 p风皿,我們知道j是第一種跳法,k就是第2個(gè)選擇的跳法所以 j>=b 分為二種轉(zhuǎn)移方程匠璧,
當(dāng)j>=b , 說(shuō)明我們第一次跳了大于p的距離如果我們第二次在大于p那么藍(lán)跳跳將會(huì)摔倒所以我們dp[4][2]+=dp[2][1] 不可以選擇dp[2][2]和dp[2][3]
那么轉(zhuǎn)移方程得:dp[i][j]+=dp[i-j][k]
當(dāng)?shù)谝淮涡∮趐的長(zhǎng)度桐款,我們第二次就把所有可能選擇上dp[4][1]=dp[3][1]+dp[3][2]+dp[3][3]
那么轉(zhuǎn)移方程得:dp[i][j]+=sum(dp[i-j])。
但是這種不是最優(yōu)解最多跑80%的數(shù)據(jù)夷恍。

程序:

#i 總步數(shù)
#j 跳一次的步數(shù)
p,b,s=map(int,input().split())
o=0
dp=[[0 for i1 in range(p+1) ] for i in range(s+1)]
dp[1][1]=1
for i in range(2,s+1):          
     for j in range(1,p+1):
        if i-j==0:
             dp[i][j]+=1
        elif j>=b:
            for k in range(1,b):
                 dp[i][j]+=dp[i-j][k]%20201114
        else:
             dp[i][j]+=sum(dp[i-j])%20201114


print(sum(dp[s])%20201114)

方法二

思路:

創(chuàng)建一個(gè)雙層的循環(huán)數(shù)組魔眨,0層存j<b的方式個(gè)數(shù),1層存b<p+1方式個(gè)數(shù)裁厅。和上面方法差不多只不過(guò)是以雙層的格式存儲(chǔ)冰沙,這樣可以少很多的計(jì)算量。
我們先把已知的數(shù)據(jù)寫入二維數(shù)據(jù)中dp[1][0]=1执虹,然后遍歷2,s+1和1,p+1,因?yàn)楫?dāng)s=0時(shí) 方法只有一種拓挥。把dp[0][1]=1 或者dp[0][0]=1 我只是把這個(gè)當(dāng)上面方法dp[i][j]+=1用了。
這個(gè)轉(zhuǎn)移方程也是2個(gè)袋励,一個(gè) (1,b) 和(b,p+1) 把j<b 存在dp[i][0] b<p+1存在dp[i][1]侥啤。
轉(zhuǎn)移方程分別為 dp[i][0]+=dp[i-j][1]+dp[i-j][0], dp[i][1]+=dp[i-j][0]茬故。
這種就可以把數(shù)據(jù)跑完了計(jì)算量把上個(gè)方法少了很多盖灸。


圖二
p,b,s=map(int,input().split())
dp=[[0 for i1 in range(2) ] for i in range(s+1)]
dp[0][1]=1
dp[1][0]=1
for i in range(2,s+1):          
    for j in range(1,b):
        if i-j<0:
            break
        dp[i][0]+=((dp[i-j][1]+dp[i-j][0])%20201114)

    for j in range(b,p+1):
        if i-j<0:
            break
        dp[i][1]+=dp[i-j][0]%20201114
        
print(sum(dp[s])%20201114)


禁止轉(zhuǎn)載。僅用于自己學(xué)習(xí)磺芭。對(duì)程序錯(cuò)誤不負(fù)責(zé)赁炎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者钾腺。
  • 序言:七十年代末徙垫,一起剝皮案震驚了整個(gè)濱河市讥裤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姻报,老刑警劉巖己英,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吴旋,居然都是意外死亡损肛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門荣瑟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)治拿,“玉大人,你說(shuō)我怎么就攤上這事褂傀∪唐。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵仙辟,是天一觀的道長(zhǎng)同波。 經(jīng)常有香客問(wèn)我,道長(zhǎng)叠国,這世上最難降的妖魔是什么未檩? 我笑而不...
    開(kāi)封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮粟焊,結(jié)果婚禮上冤狡,老公的妹妹穿的比我還像新娘。我一直安慰自己项棠,他們只是感情好悲雳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著香追,像睡著了一般合瓢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上透典,一...
    開(kāi)封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天晴楔,我揣著相機(jī)與錄音,去河邊找鬼峭咒。 笑死税弃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凑队。 我是一名探鬼主播则果,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了短条?” 一聲冷哼從身側(cè)響起导匣,我...
    開(kāi)封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茸时,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赋访,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡可都,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚓耽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渠牲。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖步悠,靈堂內(nèi)的尸體忽然破棺而出签杈,到底是詐尸還是另有隱情,我是刑警寧澤鼎兽,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布答姥,位于F島的核電站,受9級(jí)特大地震影響谚咬,放射性物質(zhì)發(fā)生泄漏鹦付。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一择卦、第九天 我趴在偏房一處隱蔽的房頂上張望敲长。 院中可真熱鬧,春花似錦秉继、人聲如沸祈噪。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辑鲤。三九已至,卻和暖如春腌巾,著一層夾襖步出監(jiān)牢的瞬間遂填,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工澈蝙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吓坚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓灯荧,卻偏偏與公主長(zhǎng)得像礁击,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容