線性dp
我們可以定義狀態dp[i][j][k]表示前i個字元,『j』改變成』z』 j 次,『z』改變成』j』 k次。
交換兩個字母,不會做無謂的操作,即不會交換兩個相同的字母,所以交換m次,就會有m個』j』變成』z』,m個』z』變成』j』。所以在j==
kj==k
j==k
的時候就是交換的的時候,這時候更新答案。
遍歷每乙個字元,首先讓dp[
i][j
][k]
=dp[
i−1]
[j][
k]
dp[i][j][k]=dp[i-1][j][k]
dp[i][
j][k
]=dp
[i−1
][j]
[k]表示只增加乙個字元,不進行交換。然後再根據s[i],s[i-1]的狀態更新新的狀態。
還有就是要注意初始化的問題,很多狀態是不能達到的,所以開始將dp陣列全部初始化為-inf。
例如,如果s[1
]==′
j′
s[1]=='j'
s[1]==
′j′,dp[
1][1
][0]
dp[1][1][0]
dp[1][
1][0
]就是不存在的,因為不會考慮』j』變為』j』的操作。
#include
#include
#include
#include
using namespace std;
typedef
long
long ll;
const
int maxn=
505;
const
int inf=
0x3f3f3f3f
;int dp[maxn]
[105][
105]
;//前i位,'j' 改變了j次,'z' 改變了k次。
int n,m,ans;
char s[maxn]
;int
main()
}}printf
("%d\n"
,ans)
;return0;
}
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的時候...
洛谷P1136 迎接儀式
題目描述 lhx教主要來x市指導oi學習工作了。為了迎接教主,在一條道路旁,一群orz教主er穿著文化衫站在道路兩旁迎接教主,每件文化衫上都印著大字。一旁的orzer依次擺出 歡迎歡迎歡迎歡迎 的大字,但是領隊突然發現,另一旁穿著 教 和 主 字文化衫的orzer卻不太和諧。為了簡單描述這個不和諧的...
洛谷P1136 迎接儀式
lhx教主要來x市指導oi學習工作了。為了迎接教主,在一條道路旁,一群orz教主er穿著文化衫站在道路兩旁迎接教主,每件文化衫上都印著大字。一旁的orzer依次擺出 歡迎歡迎歡迎歡迎 的大字,但是領隊突然發現,另一旁穿著 教 和 主 字文化衫的orzer卻不太和諧。為了簡單描述這個不和諧的佇列,我們...