日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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ù))

#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個(gè)字符是否與"niconiconi"前b個(gè)字符相同 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最大值對(duì)應(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é):動(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)容,希望文章能夠幫你解決所遇到的問題。

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