牛客動態規劃題1

2021-09-22 20:10:44 字數 1260 閱讀 7010

給你乙個長度為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...