洛谷 P1136 迎接教主 線性DP

2021-09-27 06:24:43 字數 1147 閱讀 2473

線性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卻不太和諧。為了簡單描述這個不和諧的佇列,我們...