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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

洛谷 P1136 迎接仪式 解题报告

發(fā)布時(shí)間:2023/12/13 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 P1136 迎接仪式 解题报告 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P1136 迎接儀式

題目描述

LHX教主要來(lái)X市指導(dǎo)OI學(xué)習(xí)工作了。為了迎接教主,在一條道路旁,一群Orz教主er穿著文化衫站在道路兩旁迎接教主,每件文化衫上都印著大字。一旁的Orzer依次擺出“歡迎歡迎歡迎歡迎……”的大字,但是領(lǐng)隊(duì)突然發(fā)現(xiàn),另一旁穿著“教”和“主”字文化衫的Orzer卻不太和諧。

為了簡(jiǎn)單描述這個(gè)不和諧的隊(duì)列,我們用“\(j\)”替代“教”,“\(z\)”替代“主”。而一個(gè)“\(j\)”與“\(z\)”組成的序列則可以描述當(dāng)前的隊(duì)列。為了讓教主看得盡量舒服,你必須調(diào)整隊(duì)列,使得“\(jz\)”子串盡量多。每次調(diào)整你可以交換任意位置上的兩個(gè)人,也就是序列中任意位置上的兩個(gè)字母。而因?yàn)榻讨黢R上就來(lái)了,時(shí)間僅夠最多作\(K\)次調(diào)整(當(dāng)然可以調(diào)整不滿\(K\)次),所以這個(gè)問(wèn)題交給了你。

輸入輸出格式

輸入格式:

第一行包含\(2\)個(gè)正整數(shù)\(N\)\(K\),表示了序列長(zhǎng)度與最多交換次數(shù)。

第二行包含了一個(gè)長(zhǎng)度為\(N\)的字符串,字符串僅由字母“\(j\)”與字母“\(z\)”組成,描述了這個(gè)序列。

輸出格式:

一個(gè)非負(fù)整數(shù),為調(diào)整最多\(K\)次后最后最多能出現(xiàn)多少個(gè)“\(jz\)”子串。

數(shù)據(jù)規(guī)模與約定

對(duì)于\(10\%\)的數(shù)據(jù),有\(N≤10\)

對(duì)于\(30\%\)的數(shù)據(jù),有\(K≤10\)

對(duì)于\(40\%\)的數(shù)據(jù),有\(N≤50\)

對(duì)于\(100\%\)的數(shù)據(jù),有\(N≤500,K≤100\)


神題啊,膜拜膜拜~~

看起來(lái)就是地痞,考慮一下如何把狀態(tài)都給丟進(jìn)去

因?yàn)橐淮紊婕皟蓚€(gè)地方的位置,所以我們很難把這樣的狀態(tài)準(zhǔn)確表示。

我們可以考慮先找一些特殊的突破點(diǎn)或者顯然成立的貪心性質(zhì)

說(shuō)到特殊,這個(gè)序列的字符集只有\(2\)

說(shuō)道性質(zhì),很顯然,一個(gè)位置不會(huì)被改兩次,兩個(gè)一樣字符的不會(huì)被改。

以上是我開(kāi)了上帝視角得出的,事實(shí)上,我們可能可以想到它們,但是它們不一定會(huì)真正啟發(fā)到我們

還是要看做題積累的經(jīng)驗(yàn)

下面上正解:

\(dp_{i,j,k}\)代表在位置\(i\),\('j'\)這個(gè)字符被交換過(guò)\(j\)次,\('z'\)這個(gè)字符被交換過(guò)\(k\)

請(qǐng)注意,這個(gè)交換是存在匹配的,但我們只管匹配,并不在乎具體誰(shuí)和誰(shuí)交換過(guò)

如果你沒(méi)能理解上面這句話,請(qǐng)看看狀態(tài)轉(zhuǎn)移方程

因?yàn)橐粋€(gè)匹配需要兩個(gè)字符,所以我們從\(當(dāng)前位置-2\)的地方之前進(jìn)行更新

dp[i][j][k]=dp[i-1][j][k]; if(s[i]=='j'&&s[i-1]=='z'&&j&&k)dp[i][j][k]=max(dp[i][j][k],dp[i-2][j-1][k-1]+1); if(s[i]=='z'&&s[i-1]=='j')dp[i][j][k]=max(dp[i][j][k],dp[i-2][j][k]+1); if(s[i]=='j'&&s[i-1]=='j'&&j)dp[i][j][k]=max(dp[i][j][k],dp[i-2][j-1][k]+1); if(s[i]=='z'&&s[i-1]=='z'&&k)dp[i][j][k]=max(dp[i][j][k],dp[i-2][j][k-1]+1); if(j==k) ans=max(ans,dp[i][j][k]);

格外注意一下答案更新的地方,相等時(shí)更新代表什么,其實(shí)就是代表匹配上去了,這些東西都在互有交換,但現(xiàn)在交換次數(shù)一樣了,所以我們可以更新答案

值得一提的是,我們其實(shí)并沒(méi)有單以位置劃分狀態(tài),可以注意到,匹配的位置是前后都有的,我們是把位置和交換的狀態(tài)放在一起,才做到了無(wú)后效性

個(gè)人拙見(jiàn),如有錯(cuò)誤,煩請(qǐng)?zhí)岢?/p>


Code:

#include <cstdio> #include <cstring> int max(int x,int y){return x>y?x:y;} const int N=502; int dp[N][103][103],n,m,ans; char s[N]; int main() {scanf("%d%d%s",&n,&m,s+1);memset(dp,-0x3f,sizeof(dp));dp[0][0][0]=dp[1][0][0]=dp[1][s[1]=='j'][s[1]=='z']=0;for(int i=2;i<=n;i++)for(int j=0;j<=m;j++)for(int k=0;k<=m;k++){dp[i][j][k]=dp[i-1][j][k];if(s[i]=='j'&&s[i-1]=='z'&&j&&k)dp[i][j][k]=max(dp[i][j][k],dp[i-2][j-1][k-1]+1);else if(s[i]=='z'&&s[i-1]=='j')dp[i][j][k]=max(dp[i][j][k],dp[i-2][j][k]+1);else if(s[i]=='j'&&s[i-1]=='j'&&j)dp[i][j][k]=max(dp[i][j][k],dp[i-2][j-1][k]+1);else if(s[i]=='z'&&s[i-1]=='z'&&k)dp[i][j][k]=max(dp[i][j][k],dp[i-2][j][k-1]+1);if(j==k) ans=max(ans,dp[i][j][k]);}printf("%d\n",ans);return 0; }

2018.9.5

轉(zhuǎn)載于:https://www.cnblogs.com/butterflydew/p/9594426.html

總結(jié)

以上是生活随笔為你收集整理的洛谷 P1136 迎接仪式 解题报告的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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