動態規劃學習系列 數字DP(練手三)

2021-07-04 01:11:22 字數 1184 閱讀 1934

hdu 3652

解題思路:

數字dp,狀態dp[i][j][k][c]表示 i 位數中,以 j 開頭的,模13為k的數的統計情況,其中 c 可取0或者1,0表示不包含13,1表示包含,這樣我們就可以把所有的數分成兩部分,設計狀態轉移方程。

1、狀態轉移方程

dp[i][j][(tmp*j+l)%13][1]+=dp[i-1][k][l][1];

if(j==1&&k==3) // 出現13的字首,把0的部分放進1裡面

dp[i][j][(tmp*j+l)%13][1]+=dp[i-1][k][l][0];

else // 沒有出現,把0的部分加進來

dp[i][j][(tmp*j+l)%13][0]+=dp[i-1][k][l][0];

dp過程之後,我們就可以得到乙個完備的dp陣列,包含著所有需要的數字統計資訊,之後進行統計整合。

2、統計

主要過程還是按照傳統的數字dp那麼寫,同時在dp過程中需要記錄字首的資訊( pre ),通過判斷字首,決定是否將把字尾不包含13的數字放進最終答案裡。

ac**:

#include 

#include

#include

#include

#include

using

namespace

std;

int n,dp[20][10][15][2],ans,num[20],cnt=0;

void cal(int n)

}int main()}}

}int sum=int(pow(10,cnt-1)+0.5),flag=0,pre=0;

for(int i=cnt-1;i>=0;i--)}}

if(num[i+1]==1&&num[i]==3)

flag=1;

pre+=sum*num[i],sum/=10;

}printf("%d\n",ans);

}return

0;}

總結:

注意狀態設計+細節處理。

動態規劃學習系列 數字DP(練手一)

hdu 2089 不要62 題目大意是統計 a,b 區間內沒有4並且沒有62的數,因為有之前那道題的鋪墊,很快想到了解決方法。思路 預處理乙個dp陣列,dp i,j 代表最高位為 j 的 i 位數滿足題述要求的的個數 然後分別統計 0,b 和 0,a 1 區間內滿足條件的數 與之前那題類似,不過更簡...

動態規劃學習系列 數字DP(初識)

第一次知道數字dp這東西,是在大二新手賽,那時有一道 cutting trees 的題目,現在來看就是水題一道,可以用多種方法水過,可惜當時愣是沒做出來,其他水題也沒做出來,於是被大一虐成翔。抱著學習的態度,我們再來看看這道題。多組詢問,每組詢問a和b,為 a,b 範圍內,有多少個數是由乙個上公升序...

動態規劃之數字dp

數字dp,字面意思理解就是在數字的每一位上面去dp,動態規劃一般有兩種 遞推,記憶化搜尋 dfs 這裡就是用的記憶化。一般這種用在計數上面,對那些數字上面有限制的計數。這裡上一道模板題 題中就是要你統計1 n裡有 49 的個數。dp pos sta 表示到第pos位,狀態為sta的總數。我們一般是從...