迎接仪式
Description
LHX教主要來X市指導OI學習工作了。為了迎接教主,在一條道路旁,一群Orz教主er穿著文化衫站在道路兩旁迎接教主,每件文化衫上都印著大字。一旁的Orzer依次擺出“歡迎歡迎歡迎歡迎……”的大字,但是領隊突然發現,另一旁穿著“教”和“主”字文化衫的Orzer卻不太和諧。
為了簡單描述這個不和諧的隊列,我們用“j”替代“教”,“z”替代“主”。而一個“j”與“z”組成的序列則可以描述當前的隊列。為了讓教主看得盡量舒服,你必須調整隊列,使得“jz”子串盡量多。每次調整你可以交換任意位置上的兩個人,也就是序列中任意位置上的兩個字母。而因為教主馬上就來了,時間僅夠最多作K次調整(當然可以調整不滿K次),所以這個問題交給了你。
Input
輸入文件的第1行包含2個正整數N與K,表示了序列長度與最多交換次數。
第2行包含了一個長度為N的字符串,字符串僅由字母“j”與字母“z”組成,描述了這個序列。
Output
輸出文件僅包括一個非負整數,為調整最多K次后最后最多能出現多少個“jz”子串。
Sample Input
5 2
zzzjj
Sample Output
2
Data Constraint
Hint
【樣例說明】
第1次交換位置1上的z和位置4上的j,變為jzzzj;
第2次交換位置4上的z和位置5上的j,變為jzzjz。
最后的串有2個“jz”子串。
【數據規模】
對于10%的數據,有N≤10;
對于30%的數據,有K≤10;
對于40%的數據,有N≤50;
對于100%的數據,有N≤500,K≤100。
.
.
.
.
.
.
分析
首先相同字符是不用調換的,一個字符最多被調換一次(a<—>b,b<—>c等價于a<—>c)
dp[i][j][k]表示前i個字符,改變了j個’j’和k個’z’后的“jz”串數。
那么只考慮前兩位,有四種情況(jj,jz,zj,zz)來轉移。
.
.
.
.
.
.
程序:
uses math; var n,m,ans,i,j,k:longint; s:array[-2..501]of char; dp:array[-2..501,-2..101,-2..101]of longint; beginreadln(n,m);for i:=1 to n doread(s[i]);for i:=-2 to 501 dofor j:=-2 to 101 dofor k:=-2 to 101 dodp[i,j,k]:=-maxlongint;dp[0,0,0]:=0;dp[1,0,0]:=0;if s[1]='z' then dp[1,0,1]:=0 else dp[1,1,0]:=0;ans:=0;for i:=2 to n dofor j:=0 to m dofor k:=0 to m dobegindp[i,j,k]:=dp[i-1,j,k];if (s[i-1]='j')and(s[i]='z') then dp[i,j,k]:=max(dp[i,j,k],dp[i-2,j,k]+1);if (s[i-1]='j')and(s[i]='j')and(j-1>=0) then dp[i,j,k]:=max(dp[i,j,k],dp[i-2,j-1,k]+1);if (s[i-1]='z')and(s[i]='z')and(k-1>=0) then dp[i,j,k]:=max(dp[i,j,k],dp[i-2,j,k-1]+1);if (s[i-1]='z')and(s[i]='j')and(j-1>=0)and(k-1>=0) then dp[i,j,k]:=max(dp[i,j,k],dp[i-2,j-1,k-1]+1);if j=k then ans:=max(ans,dp[i,j,k]);end;write(ans); end.轉載于:https://www.cnblogs.com/YYC-0304/p/9499982.html
總結