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的總數。我們一般是從...