#107-【數位DP】不要62
阿新 • • 發佈:2018-11-09
Description
杭州人稱那些傻乎乎粘嗒嗒的人為62(音:laoer)。
杭州交通管理局經常會擴充一些的士車牌照,新近出來一個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。
不吉利的數字為所有含有4或62的號碼。例如:62315 73418 88914
你的任務是,對於每次給出的一個牌照區間號,推斷出交管局今次又要實際上給多少輛新的士車上牌照了。
Input
輸入的都是整數對n、m(0),如果遇到都是0的整數對,則輸入結束。
Output
對於每個整數對,輸出一個不含有不吉利數字的統計個數,該數值佔一行位置。
Sample Input
1 100
0 0
Sample Output
80
數位DP模板
#include <iostream> #include <cstring> #define SIZE 110 using namespace std; long long dp[SIZE][2]; short a[SIZE]; long long dfs(int pos/*當前位置*/, bool is6/*上一位是不是6*/, bool havelimit/*有沒有限制*/) { long long res = 0; int i, len; if (!pos) { return 1; } if ((!havelimit) && (~dp[pos][is6])) { return dp[pos][is6]; // 記憶化 } len = (havelimit) ? a[pos] : 9; for (i = 0; i <= len; ++i) { if (i == 4) // 出現了4,不符合條件 { continue; } if ((is6) && (i == 2)) // 出現了62,不符合條件 { continue; } res += dfs(pos - 1, i == 6, ((havelimit) && (i == len))); } if (!havelimit) { dp[pos][is6] = res; } return res; } long long doit(int n) { long long pos = 0; while (n) { a[++pos] = n % 10; n /= 10; } return dfs(pos, false, true); } int main(int argc, char** argv) { long long a, b; while (scanf("%lld%lld", &a, &b), (a) || (b)) { memset(dp, -1, sizeof (dp)); printf("%lld\n", doit(b) - doit(a - 1)); } return 0; }