thinkphp6 的簡訊驗證碼生成、驗證類庫
阿新 • • 發佈:2020-08-28
題目連結Miku
數論dp的典型例題
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int dp[1001][15]; //事實上,對於此dp還有個限制 //沒有任何限制條件 int l[1001]; int c; int p; int p2; long long dfs(int pos,int pre,int leadz,int li){ //當前位置,前一位置,有無前道零,有無限制 int ret=0; if(pos>p2) return 1; if(dp[pos][pre]!=-1&&leadz==0&&li==0){ return dp[pos][pre]; } int lim=li? l[p2-pos+1] :9; //能列舉到那個數由限制決定 for(int i=0;i<=lim;++i){ if(i==0&&leadz) ret+=dfs(pos+1,i,1,i==lim&&li); else if(i&&leadz) ret+=dfs(pos+1,i,0,i==lim&&li); else if(abs(pre-i)>=2) ret+=dfs(pos+1,i,0,i==lim&&li); } if(leadz==0&&li==0) dp[pos][pre]=ret; return ret; } long long solve(int p){ p2=0; while(p>0){ l[++p2]=p%10; p/=10; } memset(dp,-1,sizeof(dp)); return dfs(1,0,1,1); } int main(){ cin>>p>>c; cout<<solve(c)-solve(p-1); return 0; }