日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

基础算法题——nico和niconiconi(动态规划)

發(fā)布時間:2024/3/12 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基础算法题——nico和niconiconi(动态规划) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

nico和niconiconi(動態(tài)規(guī)劃)

前言

本人為一名普通二本學(xué)校自動化專業(yè)的大二學(xué)生,對編程有著少許興趣。
動態(tài)規(guī)劃有時候真的挺摸不著頭緒的,希望這道題能加深我們對動態(tài)規(guī)劃的理解。

題目


牛客網(wǎng)題目鏈接

考查重點

①、列出狀態(tài)轉(zhuǎn)換方程
②、判斷特殊情況

題目分析

題中要求的是最大計數(shù)分?jǐn)?shù)。在同一個字符串中可能會出現(xiàn)不同的計分情況,我們要如何保證當(dāng)前的計分是最大的計分分?jǐn)?shù)呢?

計 dp[i]代表前 i 個字符的計數(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可以對應(yīng)為a、b、c)原因有兩個:
一、在s字符串中可能會出現(xiàn)連續(xù)s字符串最后四位、六位、十位 與 “niconiconi”前四位、六位、十位不相等的情況。
二、dp[i-1]可能會大于dp[i?x]+y。

當(dāng)i=3時,dp[3]=a=1;
當(dāng)i=4時,dp[4]=1;
當(dāng)i=5時,dp[5]=max(dp[5],dp[0]+b),dp[3]<dp[0]+b=2,dp[5]=2;

當(dāng)i=17時,dp[17]=max(dp[17],dp[7]+c),dp[17]<dp[7]+c=7,dp[17]=7;
當(dāng)i=18時,dp[18]=dp[17],因為s[18]="~",s字符串最后四位、六位、十位 與 “niconiconi”前四位、六位、十位不相等。
通過 dp[i] 與 dp[i]可能出現(xiàn)的分?jǐn)?shù)作對比,使得dp[i]為當(dāng)前最大計分分?jǐn)?shù)。
(加粗的dp[i],是指在0~i-1的dp最大值計數(shù)分?jǐn)?shù))

#include<bits/stdc++.h> #define ll long long using namespace std; char s[300100]; ll n, a, b, c, dp[300100], num=0;//判斷字符串s后b個字符是否與"niconiconi"前b個字符相同 bool substring(char *s, ll a, ll b) {ll i;char ss[12]="niconiconi";for(i=0; i<b&&ss[i]==s[a+i+1-b]; i++);if(i==b) return true;else return false; }int main() {cin>>n>>a>>b>>c>>s;memset(&dp, 0, sizeof(dp));for(ll i=0; i<n; i++){if(substring(s, i, 4)&&i>=3){dp[i]=max(dp[i],dp[i-4]+a);if(dp[num]<dp[i])num=i;//記錄當(dāng)前i的dp最大值對應(yīng)下標(biāo)}if(substring(s, i, 6)&&i>=5){dp[i]=max(dp[i],dp[i-6]+b);if(dp[num]<dp[i])num=i;}if(substring(s, i, 10)&&i>=9){dp[i]=max(dp[i],dp[i-10]+c);if(dp[num]<dp[i])num=i;}dp[i]=dp[num]; //傳遞當(dāng)前i的dp最大值}cout<<dp[num];return 0; }

總結(jié):動態(tài)規(guī)劃類型題,首先答案能否用遞推的方式解決(一般是求最大、最小、最優(yōu)),如果可以就要思考在如何構(gòu)造狀態(tài)轉(zhuǎn)移方程。

希望能夠?qū)⒆约旱囊恍W(xué)習(xí)經(jīng)驗分享給有需要的人。
我是小鄭,一個堅持不懈的小白,我們下次見。

總結(jié)

以上是生活随笔為你收集整理的基础算法题——nico和niconiconi(动态规划)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。