幾道字串dp的題目

2021-10-02 14:15:28 字數 3298 閱讀 8537

統計ccsu

題解:dp[1][i]代表到第i個原串字元 『c』 的字串數量。

dp[2][i]代表到第i個原串字元 'cc』的字串數量。

dp[3][i]代表到第i個原串字元 'ccs』的字串數量。

dp[4][i]代表到第i個原串字元 'ccsu』的字串數量。

#include

#define ll long long

using

namespace std;

const

int maxn =

1e5+10;

ll dp1[5]

[maxn]

,dp2[5]

[maxn]

;ll sum1[maxn]

, sum2[maxn]

;char s[maxn]

;int

main()

else

if(s[i]

=='s'

) dp1[3]

[i]+

= dp1[2]

[i-1];

else dp1[4]

[i]+

= dp1[3]

[i-1];

for(

int j=

1;j<=

4;j++

) dp1[j]

[i]+

= dp1[j]

[i-1];

}for

(int i=n;i;i--

)else

if(s[i]

=='s'

) dp2[3]

[i]+

= dp2[4]

[i+1];

else dp2[4]

[i]+=1

;for

(int j=

1;j<=

4;j++

) dp2[j]

[i]+

= dp2[j]

[i+1];

} ll ans =

1e16

;for

(int i=

1;i) ans =

min(ans,

abs(dp1[4]

[i]-dp2[1]

[i+1])

);printf

("%lld\n"

,ans)

;}

hpu』s birthday

題解:dp[1][i]代表到第i個原串字元 『1』的字串數量。

dp[2][i]代表到第i個原串字元 『11』的字串數量。

dp[3][i]代表到第i個原串字元 『110』的字串數量。

注意這題仔細分析一下複雜度和需要空間。

#include

#define ll long long

using

namespace std;

const

int maxn =

2e6+

10,mod =

1e9+7;

char d[16]

=;char b[50]

,s[maxn*2]

;int c;

ll dp[4]

[maxn]

;void

turn

(int n,

int k)

intmain()

for(

int i=

1;i<=cx;i++

)else dp[3]

[i]=

( dp[3]

[i]+ dp[2]

[i-1])

% mod;

for(

int j=

1;j<=

3;j++

) dp[j]

[i]=

(dp[j]

[i]+dp[j]

[i-1])

% mod;

}printf

("%lld\n"

,dp[3]

[cx]);

for(

int i=

1;i<=

3;i++

)for

(int j=

0;j<=cx;j++

) dp[i]

[j]=0;

}}

nico和niconiconi

題解 :

dp[i] 代表到第i個原串字元所能得到的最大分數。

看**轉移。

#include

#define ll long long

using

namespace std;

const

int maxn =

3e5+10;

ll dp[maxn]

;int

main()

cout<<}

c. divisibility by eight

題解:是個很經典的題目,給定一串字元,要求刪除其中一些字元,使得剩餘的數能被某個數整除。就這道題來說,可以暴力,因為8能被1000整除,所以只要列舉所有的三位數就行。但是還有一種更優化的方法——dp。

設dp[i][j]長度為i的字串刪除一些字元後,值為jmode8值存在。

轉移就是如果dp[i-1][j] = = 1 那麼意味著這個值是存在的,那麼dp[i][j]這個值一定存在,同樣如果我不刪除第i個字元,那麼

dp[i][(j*10+s[i])%8] 也能夠存在。再用a[i][j]儲存一下字元。

#include

#define d(x) (s[x] - '0')

using

namespace std;

char s[

110]

;int dp[

110][10

];string a[

110][10

];intmain()

dp[i]

[(j*10+

d(i))%

8]|= dp[i-1]

[j];

dp[i]

[j]|

= dp[i-1]

[j];

}for

(int i=

0;i(dp[i][0

]&&a[i][0

].size()

) cout<<

"no"

<}

幾道字串類習題

1題 wertyu 競賽基礎題 把手放在鍵盤上時,稍不注意就會往右錯一位,這樣的話q會變為w,j會變為k等。輸入乙個錯位後敲出的字串,輸出打字員本來想打出的句子。樣例輸入 o s,gomr ypfsu 樣例輸出 i am fine today.解析 本題注意兩點 1 for迴圈終止條件的判斷,常量字...

字串題目

1.數串 1.題目描述 設有n個正整數,將他們連線成一排,組成乙個最大的多位整數。如 n 3時,3個整數13,312,343,連成的最大整數為34331213。如 n 4時,4個整數7,13,4,246連線成的最大整數為7424613。輸入描述 有多組測試樣例,每組測試樣例包含兩行,第一行為乙個整數...

字串相關題目

判斷兩個字串str1和str2,是否互為旋轉詞 字串str左邊任意長度的子串挪到右邊 1234 的旋轉詞有1234 2341 3412 4123 時間複雜度為o n 做法 1 判斷兩字串長度是否相等 2 長度相等,生成str1 str1的大字串 大字串包含了str1的所有旋轉詞 3 在大字串中尋找是...