jzoj P1330 迎接儀式

2021-08-15 09:11:47 字數 1694 閱讀 1107

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

求調整最多k次後最後最多能出現多少個「jz」子串。

這題其實不難想到動態規劃,不過設dp[i][j]表示前i個字元交換了j次的最多出現多少個jz,

列舉最後一次交換的位置,即列舉乙個k,然後交換i與k,用dp[k][j-1]+1去更新dp[i][j]。

這樣的轉移顯然是o(n^2*k),效率不算高

因為每次交換就是將乙個j變成z,乙個z變成j,那麼我們就可以有另外一種方法:

設dp[i][j][k]表示前i個字元,一共將j個j變成了z,將k個z變成了j,然後討論一下當前的i與i-1是j還是z,對應轉移一下就好了。

效率大概是o(n*k^2)

var

f:array [-5..501,-1..101,-1..101] of longint;

ans,n,m,i,j,k:longint;

s:ansistring;

function

max(aa,bb:longint):longint;

begin

if aa>bb then

exit(aa);

exit(bb);

end;

begin

readln(n,m);

readln(s);

for i:=0

to n do

for j:=0

to m do

for k:=0

to m do f[i,j,k]:=-maxlongint div

3; f[0,0,0]:=0;

f[1,0,0]:=0;

if s[1]='j'

then f[1,1,0]:=0

else f[1,0,1]:=0;

for k:=2

to n do

for i:=0

to m do

for j:=0

to m do

begin

f[k,i,j]:=f[k-1,i,j];

if (s[k]='z') and (s[k-1]='j') then f[k,i,j]:=max(f[k,i,j],f[k-2,i,j]+1);

if (i>=1) and (s[k]='j') and (s[k-1]='j') then f[k,i,j]:=max(f[k,i,j],f[k-2,i-1,j]+1);

if (j>=1) and (s[k]='z') and (s[k-1]='z') then f[k,i,j]:=max(f[k,i,j],f[k-2,i,j-1]+1);

if (i>=1) and (j>=1) and (s[k]='j') and (s[k-1]='z') then f[k,i,j]:=max(f[k,i,j],f[k-2,i-1,j-1]+1);

end;

ans:=0;

for i:=0

to m do

ans:=max(ans,f[n,i,i]);

writeln(ans);

end.

P1136 迎接儀式

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

洛谷1136 迎接儀式

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

u122 迎接儀式

time limit 1 second memory limit 128 mb 問題描述 lhx教主要來x市指導oi學習工作了。為了迎接教主,在一條道路旁,一群orz教主er穿著文化衫站在道路兩旁迎接教主,每件文化衫上都印著大 字。一旁的orzer依次擺出 歡迎歡迎歡迎歡迎 的大字,但是領隊突然發現...