給你乙個長度為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?應該算是吧,看別人部落格這麼說的,咱也不知道,咱也不敢問。。。
直接貼**吧
#include#include#includeusing namespace std;
long long mod=1e9+7;
long long b[60][10];
int main (){
int a[100];
string s;
cin>>s;
for(int i=0;i**不怎麼複雜,但是理解起來還是有點困難的。
b陣列用來儲存當前數字個數時,餘數分別為0,1,2的子串個數。
首先遍歷一遍,把存在餘數為0,1,2的b【 】變為1,然後就是重點了。
它的狀態轉移方程有三種情況,新加進來的數可能餘數為0,1,2。
當餘數為0時,b[i]是上一次的個數乘以2加上1,例如原來是3,6,9,現在加進來乙個3,它和原來的任意一種組合都可以被3整除,所以要乘以2,再加上它本身,b[i][1】和3的任意組合還是1,所以要乘以2,同理b【i】。
當新加進來的餘數為1時,它和餘數為2的子串任意組合都可以被3整除,所以b【i】=b【i-1】+b【i-1】,
它和餘數為零的子串任意組合餘數都為1,所以b[i][1]=b[i-1][0]+b[i-1][1]+1,它和餘數為1的組合餘數變為2,所以b[i][2]=b[i-1][1]+b[i-1][2]。
同理可得新加餘數為2時,b[i][0]=b[i-1][0]+b[i-1][1];b[i][1]=b[i-1][2]+b[i-1][1];b[i][2]=b[i-1][0]+b[i-1][2]+1。
我自己理解的大概就是這樣了,如果有不對的還請大佬指點。
話說這是兩顆星的題?這評分對菜雞一點也不友好,手動憤怒!
牛客 拜訪 動態規劃
左右中只能選乙個方向,若選擇左只能一直向左走。上下中只能選擇乙個方向,若選擇下只能一直向下。所以有2種情況 1 二者位置在對角線上 2 兩者位置重合或處於同一行或同一列 class visit if map i j 2 同行或同列 這裡應該還能優化到下面的對角線那種情況 懶 if si ei if ...
牛客題霸 簡單變向 動態規劃解
牛牛準備在乙個3行n列的跑道上跑步。一開始牛牛位於 1,1 跑到第i行第j 1列 跑到第i 1行第j 1列 如果i 1則不可以這麼跑 跑到第i 1行第j 1列 如果i 3則不可以這麼跑 跑道上有一些格仔設定了路障 乙個格仔可能有多個路障 牛牛不能跑到路障上。現在牛牛想知道,從 1,1 到 3,n 有...
牛客網總結 動態規劃
目錄 重要資料 c 面試題系列 牛客力扣 nc121 字串的排列 華為機試 hj16 購物單 hj24合唱隊 hj61放蘋果?dd大牛的 揹包九講 演算法萌新如何學好動態規劃 3 動態規劃之揹包問題系列 c 面試題系列290題 計算字串相似度 字串的排列和組合問題 nc126 換錢最少貨幣數 nc1...