被3整除的子串行(線性dp)

2021-09-23 20:52:03 字數 1039 閱讀 3367

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 524288k,其他語言1048576k

64bit io format: %lld

題目描述

給你乙個長度為50的數字串,問你有多少個子序列構成的數字可以被3整除

答案對1e9+7取模

輸入描述:

輸入乙個字串,由數字構成,長度小於等於50

輸出描述:

輸出乙個整數

示例1輸入

複製輸出

複製示例2

輸入複製

輸出複製

示例3輸入

複製輸出

複製示例4

輸入複製

輸出複製

示例5輸入

複製輸出

複製備註:

n為長度

子任務1: n <= 5

子任務2: n <= 20

子任務3: 無限制

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

因此可以把字串每個數字取模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 的子串行單獨加上。

ac**:

#includeusing namespace std;

int main()

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

return 0;

}

被3整除的子串行(線性dp)

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

dp被3整除的子串行

給你乙個長度為50的數字串,問你有多少個子序列構成的數字可以被3整除 答案對1e9 7取模 輸入乙個字串,由數字構成,長度小於等於50輸出乙個整數示例1 複製132 複製3 示例2複製9 複製1 示例3複製333 複製7 示例4複製123456 複製23 示例5複製00 複製3 n為長度 子任務1 ...

DP 被3整除的子串行

題意 給定乙個數字串,然後求出所有子串行中能被3整除的個數。題解 1 狀態表示 f i j 指的是,以s i 結尾的對3取餘後值為j的集合 2 f i j 方案數 3 集合劃分 每次轉移都是從f 1,2,i 1 0,1,2 1 include2 include3 include4 include5 ...