1. 程式人生 > >數位dp模板 [dp][數位dp]

數位dp模板 [dp][數位dp]

位數 ati stat blog pan 沒有 nbsp namespace +=

現在才想到要學數位dp,我是不是很弱

答案是肯定的

以一道自己瞎掰的題為模板

 1 //題:
 2 //輸入數字n 
 3 //從0枚舉到n,計算這n+1個數中含有兩位數a的數的個數
 4 //如12930含有兩位數93 
 5 #include<cstdio>
 6 #include<cstring>
 7 #include<iostream>
 8 using namespace std;
 9 
10 int n,m=0,a,g1,g2;
11 int dp[10][10][2],lim[10];
12 
13 void init(){
14     scanf("
%d%d",&n,&a); 15 g1=a/10; g2=a%10; 16 int nn=n;while(nn){ 17 lim[++m]=nn%10; 18 nn/=10; 19 } 20 } 21 22 int dfs(int pos,int pre,bool status,bool limit){ 23 printf("dfs(%d,%d,%d,%d)\n",pos,pre,status,limit); 24 if(pos<1) return status; 25 //已找到答案的嘿嘿嘿
26 if(!limit&&dp[pos][pre][status]!=-1) return dp[pos][pre][status]; 27 28 int end=limit?lim[pos]:9; 29 int ret=0; 30 31 for(int i=0;i<=end;i++) 32 ret+=dfs(pos-1,i,status||(pre==g1&&i==g2),limit&&(i==end)); 33 34 //沒有限制才能記錄答案
35 return limit?dp[pos][pre][status]=ret:ret; 36 } 37 38 int main(){ 39 init(); 40 memset(dp,-1,sizeof dp); 41 printf("%d\n",dfs(m,0,0,1)); 42 return 0; 43 }

數位dp模板 [dp][數位dp]