hdu2089 不要62 數位DP模板題
阿新 • • 發佈:2019-01-29
算是學習數位dp的入門題。。。
具體看程式碼中註釋
#include <cstdio> #include <string> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #define maxn 30 using namespace std; int limit[40];//儲存數字的各位值 int dp[40][10]; int dfs(int now,int prev,bool flag) { if(now<=0) return 1; if(!flag&&dp[now][prev]!=-1) return dp[now][prev]; //記憶化搜尋 int bound=flag?limit[now]:9,ret=0; //如果此時為邊界,則bound最大值為limit[now] for(int k=0;k<=bound;k++) { if(k==4) continue; if(k==2&&prev==1) continue; ret+=dfs(now-1,k==6,flag&&(k==bound)); } if(!flag) dp[now][prev]=ret; return ret; } int count(int x) { int len=0; while(x) { limit[++len]=x%10;//將x的各位用limit陣列儲存 x/=10; } return dfs(len,0,true); } int main() { int n,m; memset(dp,-1,sizeof(dp)); while(cin>>n>>m) { if(n==0&&m==0) break; cout<<count(m)-count(n-1)<<endl; } return 0; }