HDU 2089:不要62(数位DP)
类型:数位DP
题意:定义一个好的数为 没有出现“4”和“62” 这样的数。问[n,m]之间有多少这样的数。(0<n≤m<1000000)
思路:
简单的数位DP
定义状态
dp[i][d]为 d开头的i位数中 好数的个数
dp[i][d] = sum(dp[i-1][0,1,3,5~9]) + (d!=6)*(dp[i-1][2]);
出口:dp[1][0~9] = 1;
代码:
#include <cstdio> #include <cstring> int dp[15][10]; int num[120]; int dfs(int i, int now, bool iscount) { if (!iscount && dp[i][now] != -1) return dp[i][now]; if (i == 1) { if (now == 4) return dp[i][now] = 0; else return dp[i][now] = 1; } int end = iscount?num[i-1]:9; int ans = 0; for (int d = 0; d <= end; d++) { if ((now == 6 && d == 2) || d == 4) continue; ans += dfs(i-1, d, iscount && d == end); } if (!iscount) dp[i][now] = ans; return ans; } int cal(int x) { int len = 0; while (x) { num[++len] = x%10; x /= 10; } return dfs(len+1, 0, 1); } int main(){ int n, m; while (scanf("%d%d", &n, &m) != EOF) { if (n == 0 && m == 0) return 0; memset(dp, -1, sizeof(dp)); printf("%d\n", cal(m)-cal(n-1)); } return 0; }
posted on 2014-03-13 20:20 ShineCheng 阅读(154) 评论(0) 编辑 收藏 举报