HDU 2089 数位DP

来源:互联网 发布:node.js与php 编辑:程序博客网 时间:2024/04/19 20:58


题意:不要62 和 4;


思路:dp[i][0] : 表示 前i 位 首位是4的不吉利数个数

dp[i][1]: 表示前i位第i+1位是6的不吉利数个数;

dp[i][2] : 表示前i位含不吉利数个数


eg:

n=100,a[1]=0,a[2]=0,a[3]=1;


dp[1][0] = 1 即为4;


dp[1][1]=2   62,64;


dp[1][2]= 10     40,41,42,43,44,45,46,47,48,49;


dp[2][0]=20 = dp[1][0]+dp[1][1]+dp[1][2]+14,24,34,54,74,84,94;


#include<stdio.h>#include<algorithm>#include<string>#include<string.h>#include<iostream>using namespace std;int a[20];int dp[20][3];int dfs(int pos, int st, bool flag){if(pos == 0) return st == 2;if(flag && dp[pos][st] != -1)return dp[pos][st];int ans = 0;int u = flag ? 9 : a[pos];for(int i = 0; i <= u; i++){if(st == 2 || i == 4 || (st == 1 && i == 2))ans += dfs(pos-1, 2, flag || i < u);else if(i == 6)ans += dfs(pos-1, 1, flag || i < u);else ans += dfs(pos-1, 0,flag || i < u);}if(flag) dp[pos][st] = ans;return  ans;}int cal(int n){int len = 0;while(n){a[++len] = n % 10;n /= 10;}return dfs(len, 0, 0);}int main(){int n,m;memset(dp, -1, sizeof(dp));while(~scanf("%d%d",&n, &m)){if(n == 0 && m == 0)return 0;printf("%d\n",m - n + 1 - cal(m) + cal(n-1));}return 0;}



0 0