被3整除的子序列(线性dp)
鏈接:https://ac.nowcoder.com/acm/problem/21302
來(lái)源:牛客網(wǎng)
題目描述
給你一個(gè)長(zhǎng)度為50的數(shù)字串,問(wèn)你有多少個(gè)子序列構(gòu)成的數(shù)字可以被3整除
答案對(duì)1e9+7取模
輸入描述:
輸入一個(gè)字符串,由數(shù)字構(gòu)成,長(zhǎng)度小于等于50
輸出描述:
輸出一個(gè)整數(shù)
示例1
輸入
復(fù)制
132
輸出
復(fù)制
3
示例2
輸入
復(fù)制
9
輸出
復(fù)制
1
示例3
輸入
復(fù)制
333
輸出
復(fù)制
7
示例4
輸入
復(fù)制
123456
輸出
復(fù)制
23
示例5
輸入
復(fù)制
00
輸出
復(fù)制
3
備注:
n為長(zhǎng)度
子任務(wù)1: n <= 5
子任務(wù)2: n <= 20
子任務(wù)3: 無(wú)限制
字符串最長(zhǎng)是50,所以整個(gè)字符串每個(gè)數(shù)位最大值加和就是450.所以我們可以枚舉數(shù)位的加和。
dp[i][j]代表著前i位,加值和為j的子序列的個(gè)數(shù)。
狀態(tài)轉(zhuǎn)移方程為:首先令dp[i][j]=dp[i-1][j]
如果當(dāng)前位值為x并且x==j,那么dp[i][j]++;這代表著這一位所做的貢獻(xiàn)。
如果當(dāng)前位值為x并且x>=j,那么dp[i][j]+=dp[i-1][j-x];代表著這一位與之前的每個(gè)數(shù)位合起來(lái)整體的貢獻(xiàn)。
代碼如下:
今天吃飯突然想起另一種做法。
我們之前是枚舉的前面加值和,那么我們也可以枚舉余數(shù)的。畢竟這個(gè)題目數(shù)據(jù)量小可以枚舉加值和,但是遇到數(shù)據(jù)量大的就不行了。我們枚舉余數(shù),其實(shí)和枚舉加值和的相差無(wú)異。
代碼如下:
努力加油a啊,(o)/~
總結(jié)
以上是生活随笔為你收集整理的被3整除的子序列(线性dp)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: codeforces(牛客网dp专题,排
- 下一篇: 黑白树(牛客网+树形dp)