給出乙個不和諧的佇列,用「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依次擺出 歡迎歡迎歡迎歡迎 的大字,但是領隊突然發現...