基础算法题——nico和niconiconi(动态规划)
nico和niconiconi(動(dòng)態(tài)規(guī)劃)
前言
本人為一名普通二本學(xué)校自動(dòng)化專業(yè)的大二學(xué)生,對(duì)編程有著少許興趣。
動(dòng)態(tài)規(guī)劃有時(shí)候真的挺摸不著頭緒的,希望這道題能加深我們對(duì)動(dòng)態(tài)規(guī)劃的理解。
題目
牛客網(wǎng)題目鏈接
考查重點(diǎn)
①、列出狀態(tài)轉(zhuǎn)換方程
②、判斷特殊情況
題目分析
題中要求的是最大計(jì)數(shù)分?jǐn)?shù)。在同一個(gè)字符串中可能會(huì)出現(xiàn)不同的計(jì)分情況,我們要如何保證當(dāng)前的計(jì)分是最大的計(jì)分分?jǐn)?shù)呢?
計(jì) dp[i]代表前 i 個(gè)字符的計(jì)數(shù)最大值。
那么可得狀態(tài)轉(zhuǎn)移方程:
if(substring(s,i,4)==nico) dp[i]=max(dp[i],dp[i?4]+a)
if(substring(s,i,6)==niconi) dp[i]=max(dp[i],dp[i?6]+b)
if(substring(s,i,10)==niconiconi) dp[i]=max(dp[i],dp[i?10]+c)
參考:神崎蘭子
eg:在s=“niconiconiconiconi~”,a=1,b=2,c=5條件下
首先:寫出函數(shù)substring()(Java自帶,C語言則要手寫)
判斷s字符串最后四位、六位、十位 與 “niconiconi”前四位、六位、十位是否相等。
其次:dp[i]=dp[i-1]后再進(jìn)行dp[i]=max(dp[i],dp[i?x]+y)的賦值。(x可以為4、6、10,y可以對(duì)應(yīng)為a、b、c)原因有兩個(gè):
一、在s字符串中可能會(huì)出現(xiàn)連續(xù)s字符串最后四位、六位、十位 與 “niconiconi”前四位、六位、十位不相等的情況。
二、dp[i-1]可能會(huì)大于dp[i?x]+y。
當(dāng)i=3時(shí),dp[3]=a=1;
當(dāng)i=4時(shí),dp[4]=1;
當(dāng)i=5時(shí),dp[5]=max(dp[5],dp[0]+b),dp[3]<dp[0]+b=2,dp[5]=2;
…
當(dāng)i=17時(shí),dp[17]=max(dp[17],dp[7]+c),dp[17]<dp[7]+c=7,dp[17]=7;
當(dāng)i=18時(shí),dp[18]=dp[17],因?yàn)閟[18]="~",s字符串最后四位、六位、十位 與 “niconiconi”前四位、六位、十位不相等。
通過 dp[i] 與 dp[i]可能出現(xiàn)的分?jǐn)?shù)作對(duì)比,使得dp[i]為當(dāng)前最大計(jì)分分?jǐn)?shù)。
(加粗的dp[i],是指在0~i-1的dp最大值計(jì)數(shù)分?jǐn)?shù))
總結(jié):動(dòng)態(tài)規(guī)劃類型題,首先答案能否用遞推的方式解決(一般是求最大、最小、最優(yōu)),如果可以就要思考在如何構(gòu)造狀態(tài)轉(zhuǎn)移方程。
希望能夠?qū)⒆约旱囊恍W(xué)習(xí)經(jīng)驗(yàn)分享給有需要的人。
我是小鄭,一個(gè)堅(jiān)持不懈的小白,我們下次見。
總結(jié)
以上是生活随笔為你收集整理的基础算法题——nico和niconiconi(动态规划)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三大类计算机语言的相关知识,计算机语言有
- 下一篇: Ken按特性开发核心思想