不要62 【數位dp的入門題】
阿新 • • 發佈:2019-02-02
不要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