被3整除的子串行 (牛客2星題)(線性DP)

2021-10-01 19:29:49 字數 941 閱讀 5899

題目:

給你乙個長度為50的數字串,問你有多少個子序列構成的數字可以被3整除(輸入乙個字串,由數字構成,長度小於等於50)

答案對1e9+7取模

樣例1:輸入:132  輸出:3

樣例2:輸入:123456 輸出:23

首先要知道被三整除的數字的特徵   只要所有數字數字的和可以被三整出即可。

因此可以把字串每個數字取模3 處理成 只有0 1 2三個字元的串。

二維陣列dp[i] [j] 表示 前 i 個長度的所有子串行數字數字和取模 3 為 j 的數目( 0 <= j <= 2)

有狀態轉移方程 :dp[i] [j] = (dp[i - 1] [j] + dp[i - 1] [ (3 + j - m) % 3]) % 1000000007;

表示dp[i] [j]可以由兩種情況遞推過來:

1.  第 i 個數字不用, 直接繼承 dp[i - 1] [j]。

2. 第 i 個數字與前邊的一些數字和為 ( 3 +  j - m) % 3 的所有子串行相接。

最後這個數字自己構成長度為 1 的子串行單獨加上。

比如樣例132來說

i          j01

2101

0212

0332

2

#include#includeusing namespace std;

int main()

printf("%d",dp[a.length()][0]%mod);

return 0;

}

wdnmd我dp為啥學的這麼差,看半天才明白

牛客 被3整除的子串行(DP)

示例1 輸入複製 132輸出複製3 示例2輸入複製9 輸出複製 1示例3 輸入複製 333輸出複製7 示例4輸入 複製123456 輸出複製 23示例5 輸入複製 00輸出複製3 被三整除的數的乙個性質是所有數字的數加起來是3的倍數。列舉三個狀態,模3等於0,模3等於1和模3等於2,那麼考慮第i個位...

牛客競賽 被3整除的子串行

題目描述 給你乙個長度為50的數字串,問你有多少個子序列構成的數字可以被3整除 答案對1e9 7取模 輸入描述 輸入乙個字串,由數字構成,長度小於等於50 輸出描述 輸出乙個整數 dp i k 前i個數,湊出餘數為k的方案 兩種選擇,一種從前面湊得轉移過來,一種什麼不做直接加上前面的方案 inclu...

牛客 被3整除的子串行(區間DP)

時間限制 c c 1秒,其他語言2秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld 題目描述 給你乙個長度為50的數字串,問你有多少個子序列構成的數字可以被3整除 答案對1e9 7取模 輸入描述 輸入乙個字串,由數字構成,長度小於等於50 輸出描...