洛谷 P1136 迎接仪式 解题报告
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)題。
- 上一篇: ssl 的jks 生成工具
- 下一篇: Xpath使用方法