HDU 2089 不要62(数位dp)

来源:互联网 发布:非洲提督知乎 编辑:程序博客网 时间:2024/06/05 08:21

解题思路:

与HDU 3555一致。

#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <algorithm>#include <vector>#include <cmath>#include <queue>#include <stack>#define LL long long using namespace std;int dp[10][3];void init(){dp[0][0] = 1;dp[0][1] = dp[0][2] = 0;for(int i=1;i<=6;i++){dp[i][0] = dp[i-1][0] * 9 - dp[i-1][1];dp[i][1] = dp[i-1][0];dp[i][2] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2] * 10;}}int bit[10];int solve(int n){int tmp = n;int len = 0;memset(bit, 0, sizeof(bit));while(n){bit[++len] = n % 10;n /= 10;}int ans = 0;bool flag = false;for(int i=len;i>=1;i--){ans += dp[i-1][2] * bit[i];if(flag) ans += dp[i-1][0] * bit[i];if(!flag && bit[i] > 4) ans += dp[i-1][0];if(!flag && bit[i+1] == 6 && bit[i] > 2) ans += dp[i][1];if(!flag && bit[i] > 6) ans += dp[i-1][1];if(bit[i] == 4 || (bit[i+1] == 6 && bit[i] == 2)) flag = true;}if(flag) ans++;return tmp - ans;}int main(){init();int n, m;while(scanf("%d%d", &n, &m)!=EOF){       if(n == 0 && m == 0)break;printf("%d\n", solve(m) - solve(n-1));}return 0;}


0 0