P1136 迎接儀式

2021-08-05 23:33:31 字數 1366 閱讀 9779

題目描述

lhx教主要來x市指導oi學習工作了。為了迎接教主,在一條道路旁,一群orz教主er穿著文化衫站在道路兩旁迎接教主,每件文化衫上都印著大字。一旁的orzer依次擺出「歡迎歡迎歡迎歡迎……」的大字,但是領隊突然發現,另一旁穿著「教」和「主」字文化衫的orzer卻不太和諧。

為了簡單描述這個不和諧的佇列,我們用「j」替代「教」,「z」替代「主」。而乙個「j」與「z」組成的序列則可以描述當前的佇列。為了讓教主看得盡量舒服,你必須調整佇列,使得「jz」子串盡量多。每次調整你可以交換任意位置上的兩個人,也就是序列中任意位置上的兩個字母。而因為教主馬上就來了,時間僅夠最多作m次調整(當然可以調整不滿k次),所以這個問題交給了你。

輸入格式:

輸入檔案welcome.in的第1行包含2個正整數n與m,表示了序列長度與最多交換次數。

第2行包含了乙個長度為n的字串,字串僅由字母「j」與字母「z」組成,描述了這個序列。

輸出格式:

輸出檔案welcome.out僅包括乙個非負整數,為調整最多m次後最後最多能出現多少個「jz」子串。

資料範圍:

對於100%的資料,有n≤500,m≤100。

一道dp好題。這個題交換是隨機的,所以不能直接設狀態,可是顯然,交換m次也就等於把m個j變成z,把m個z變成j。於是我們可以設f[i][j][k]表示前i個字元中變j個j和變k個z後最多的「js」數。

似乎就寫出來了,可是提交wa了兩個點。一看題解,竟然是初始化的問題。

memset(dp,-0x3f,sizeof(dp));

dp[0][0][0]=dp[1][0][0]=0;

if(s[1]=='z') dp[1][0][1]=0;

else dp[1][1][0]=0;

為什麼要這麼初始化?我本來全部初始化成0。絞盡腦汁後我終於想通了,原來當s[1]=j時,dp[1][0][1]和dp[1][1][1]是不存在的!當然不能轉移後面的狀態了。一開始我還天真的設為0,這樣還是可以轉移後面的狀態。

**如下:

#include

#include

#include

using

namespace

std;

int dp[501][101][101]=;

int ans=0;

char s[501];

int main()}}

printf("%d",ans);

return

0;}

P1136 迎接儀式

傳送門 顯然是dp 但是交換會改變後面的狀態,好像很麻煩 我們設 f i j k 表示到了第 i 個字元,j 交換了 j 次,k 交換了 k 次後最多的匹配數 我們每次只考慮當前要改變的字元,而不考慮具體跟誰交換 那麼在乙個狀態中,如果j k 說明還有 j k 個 j 目前找不到交換目標,但是經過後...

洛谷P1136 迎接儀式

題目描述 lhx教主要來x市指導oi學習工作了。為了迎接教主,在一條道路旁,一群orz教主er穿著文化衫站在道路兩旁迎接教主,每件文化衫上都印著大字。一旁的orzer依次擺出 歡迎歡迎歡迎歡迎 的大字,但是領隊突然發現,另一旁穿著 教 和 主 字文化衫的orzer卻不太和諧。為了簡單描述這個不和諧的...

洛谷P1136 迎接儀式

lhx教主要來x市指導oi學習工作了。為了迎接教主,在一條道路旁,一群orz教主er穿著文化衫站在道路兩旁迎接教主,每件文化衫上都印著大字。一旁的orzer依次擺出 歡迎歡迎歡迎歡迎 的大字,但是領隊突然發現,另一旁穿著 教 和 主 字文化衫的orzer卻不太和諧。為了簡單描述這個不和諧的佇列,我們...