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

2021-09-22 21:12:44 字數 1091 閱讀 3636

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

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

64bit io format: %lld

題目描述

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

答案對1e9+7取模

輸入描述:

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

輸出描述:

輸出乙個整數

示例1輸入

複製132

輸出複製

3示例2

輸入複製9輸出

複製1示例3輸入

複製333

輸出複製

7示例4

輸入複製

123456

輸出複製

23示例5

輸入複製

00輸出複製3

備註:n為長度

子任務1: n <= 5

子任務2: n <= 20

子任務3: 無限制

思想:dp[i][j][0]表示i,j之間 子串行值%30 的子串行個數

dp[i][j][1]表示i,j之間 子串行值%31 的子串行個數

dp[i][j][2]表示i,j之間 子串行值%3==2 的子串行個數

則很容易得到狀態轉移方程:

s[j + 1] - 『0』 % 3 == 0時:

s[j + 1] - 『0』 % 3 == 1時:

s[j + 1] - 『0』 % 3 == 2時:

**如下:

#includeusing namespace std;

const int mod = 1e9 + 7;

int dp[50][50][4];

int main()

for(int i = 1;i <= s.length();i++)

for(int i = 1;i <= s.length();i++)else if((s[j + 1] - '0')% 3 == 1)else

for(int k = 0;k < 3;k++)

} }cout

}

牛客 被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...

牛客網 21302 被3整除的子串行

題目描述 給你乙個長度為50的數字串,問你有多少個子序列構成的數字可以被3整除 答案對1e9 7取模 輸入描述 輸入乙個字串,由數字構成,長度小於等於50 輸出描述 輸出乙個整數 輸入 132931 題意 題目描述 題解 因為是子串行,所以可以不連續,因此需要儲存每個區間上餘數為0,1,2的數目 用...