標籤:區間dp
題目描述
lhx教主要來x市指導oi學習工作了。為了迎接教主,在一條道路旁,一群orz教主er穿著文化衫站在道路兩旁迎接教主,每件文化衫上都印著大字。一旁的orzer依次擺出「歡迎歡迎歡迎歡迎……」的大字,但是領隊突然發現,另一旁穿著「教」和「主」字文化衫的orzer卻不太和諧
為了簡單描述這個不和諧的佇列,我們用「j」替代「教」,「z」替代「主」。而乙個「j」與「z」組成的序列則可以描述當前的佇列。為了讓教主看得盡量舒服,你必須調整佇列,使得「jz」子串盡量多。每次調整你可以交換任意位置上的兩個人,也就是序列中任意位置上的兩個字母。而因為教主馬上就來了,時間僅夠最多作k次調整(當然可以調整不滿k次),所以這個問題交給了你。
輸入輸出格式
輸入格式:
輸入檔案welcome.in的第1行包含2個正整數n與k,表示了序列長度與最多交換次數。
第2行包含了乙個長度為n的字串,字串僅由字母「j」與字母「z」組成,描述了這個序列。
輸出格式:
輸出檔案welcome.out僅包括乙個非負整數,為調整最多k次後最後最多能出現多少個「jz」子串。
輸入輸出樣例
輸入樣例#1:
5 2
zzzjj
輸出樣例#1: 2
說明【樣例說明】
第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。
分析:
給定:長度為n的字串
求:max(字串中「jz」這個子串最多個數)
滿足:交換任意兩個字元的次數<=k
貪心:從前往後找到第乙個未形成「jz」的z,將第乙個「z」換成當前第乙個未形成」jz「的「j」
eg.zzzjj
p=2,q=4;
jzzzj
p=4 q=5
符合樣例,但是只有20分
顯然這種n<=500的資料範圍是不可能貪心的,反例如下
7 1jjjzzzj
正解:dp
f[i][j1][j2]表示前i個字元,改變了j1個『j』和j2個』z』後的』jz』個數
狀態轉移方程
f[i][j1][j2]=max(f[i-1][j1][j2], //未做任何變動
f[i-2][j1-1][j2]+1 //s[i]=j,s[i-1]=j的情況(就是「jj」)
f[i-2][j1][j2-1]+1 //s[i]=z,s[i-1]=z(兩個z的情況)
f[i-2][j1-1][j2-1]+1 )//s[i]=j,s[i-1]=z (「zj」的情況)
ans=max(f[i][j1][j2]) (滿足j1=j2)
code
#include#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define mem(x,num) memset(x,num,sizeof x)
#define ll long long
using namespace std;
const int maxn=506,maxk=106,inf=0x3f3f3f;
char s[maxn];
int f[maxn][maxk][maxk],n,k,ans=0;
int main()
printf("%d\n",ans);
return 0;
}
洛谷P1136 迎接儀式
題目描述 lhx教主要來x市指導oi學習工作了。為了迎接教主,在一條道路旁,一群orz教主er穿著文化衫站在道路兩旁迎接教主,每件文化衫上都印著大字。一旁的orzer依次擺出 歡迎歡迎歡迎歡迎 的大字,但是領隊突然發現,另一旁穿著 教 和 主 字文化衫的orzer卻不太和諧。為了簡單描述這個不和諧的...
洛谷P1136 迎接儀式
lhx教主要來x市指導oi學習工作了。為了迎接教主,在一條道路旁,一群orz教主er穿著文化衫站在道路兩旁迎接教主,每件文化衫上都印著大字。一旁的orzer依次擺出 歡迎歡迎歡迎歡迎 的大字,但是領隊突然發現,另一旁穿著 教 和 主 字文化衫的orzer卻不太和諧。為了簡單描述這個不和諧的佇列,我們...
dp 洛谷P1136 迎接儀式
玄學dp 首先我們發現這道題有些奇怪的性質 交換k次,其實意味著k個j變成z,k個z變成j。而且每個字最多交換一次 但是一次交換,有可能對答案的貢獻 1 也有可能 2 這個怎麼辦呢?f i j k 表示前i個裡面,j 變成 z j次 z 變成 j k次 通過s i 和s i 1 更新 當i k的時候...