您的位置:首页 > 其它

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;

代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: