HDU 2089:不要62(数位DP)
2014-03-13 20:20
501 查看
类型:数位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;
代码:
题意:定义一个好的数为 没有出现“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; }
相关文章推荐
- hdu 2089 不要62 (数位dp)
- HDU 2089 不要62 数位dp(入门
- HDU 2089 不要62(数位DP·记忆化搜索)
- hdu 2089 不要62 数位dp
- HDU 2089 不要62(数位DP)
- HDU 2089 不要62 【数位DP】
- hdu 2089 不要62 数位dp
- HDU 2089 不要62(数位DP入门+模板)
- HDU 2089 不要62(数位dp)
- [数位DP]Hdu 2089——不要62
- hdu 2089 不要62 (数位DP)
- HDU 2089 不要62 数位dp
- 【数位DP】Hdu 2089:不要62
- HDU 2089 不要62【数位DP】
- Hdu 2089 不要62(数位dp入门)
- hdu 2089 不要62 【数位DP】
- HDU 2089 不要62 (数位DP,入门)
- (数位DP 1.1)hdu 2089 不要62(求一个区间[a,b]中不包含4,64的数的个数)
- hdu 2089 不要62 (数位DP)
- hdu-2089 不要62【数位dp】