1. 程式人生 > >不要62 【數位dp的入門題】

不要62 【數位dp的入門題】

不要62

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 50740    Accepted Submission(s): 19247


Problem Description 杭州人稱那些傻乎乎粘嗒嗒的人為62(音:laoer)。
杭州交通管理局經常會擴充一些的士車牌照,新近出來一個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。
不吉利的數字為所有含有4或62的號碼。例如:
62315 73418 88914
都屬於不吉利號碼。但是,61152雖然含有6和2,但不是62連號,所以不屬於不吉利數字之列。
你的任務是,對於每次給出的一個牌照區間號,推斷出交管局今次又要實際上給多少輛新的士車上牌照了。

Input 輸入的都是整數對n、m(0<n≤m<1000000),如果遇到都是0的整數對,則輸入結束。

Output 對於每個整數對,輸出一個不含有不吉利數字的統計個數,該數值佔一行位置。

Sample Input
1 100 
0 0

Sample Output
80

Author qianneng
Source
Recommend lcy

題意: 略

分析: 這是數位dp的基礎題,感覺還行,不難理解的,主要是就是dfs裡面的limit變數有點難理解,尤其是記憶化時取法,就當個模板來學了,推薦這裡,大神的總結還是很好的

參考程式碼

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1e5 + 7;

int dp[11][3];
int d[11];

int dfs (int cnt, int pre, int sta, bool
limit) { if (cnt < 0) return 1; if (!limit && dp[cnt][sta] != -1) { return dp[cnt][sta]; } int up = limit ? d[cnt] : 9; int sum = 0; for (int i = 0; i <= up; i++) { if (i == 4) continue; if (i == 2 && pre == 6) continue; sum += dfs(cnt - 1
, i, i == 6, limit && i == d[cnt]); } if (!limit) { dp[cnt][sta] = sum; } return sum; } int solve (int x) { memset (dp,-1,sizeof dp); int cnt = 0; while (x) { d[cnt++] = x % 10; x /= 10; } return dfs(cnt - 1, -1, 0, true); } int main() { int n,m; while (~ scanf("%d%d", &n, &m), n+m) { printf("%d\n",solve(m) - solve(n - 1)); } return 0; }
  • 如有錯誤或遺漏,請私聊下UP,thx