HDU 2089 不要62(数位dp)

来源:互联网 发布:mac 下 ftp上传工具 编辑:程序博客网 时间:2024/05/16 19:35


题意: 计区间 [a,b] 中不含 4 和 62 的数字有多少个。

思路:数位dp,首先可以这个区间之间的个数等于[0,b] - [0,a-1]的个数

对于一个区间[0, a],状态dp(len, six, same)每一位分别表示当前位,上一位是否为6,当前位之前的数字是否和a完全相同

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<algorithm>#include<vector>#include<map>#include<queue>#include<stack>#include<string>#include<map>#include<set>#include<ctime>#define eps 1e-6#define LL long long#define pii (pair<int, int>)//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;//const int maxn = 100 + 5;//const int INF = 0x3f3f3f3f;int n, m; int digit[50];int dp[50][2];int dfs(int len, bool six, bool same) {if(!len) return 1;if(!same && dp[len][six] != -1) return dp[len][six];int maxd = same ? digit[len] : 9;int ans = 0;for(int i = 0; i <= maxd; i++) {if(i==4 || i==2&&six) continue;ans += dfs(len-1, i==6, same&&i==digit[len]);}if(!same) dp[len][six] = ans;return ans;}int cal(int d) {int cnt = 0;while(d) {digit[++cnt] = d%10;d = d/10;}return dfs(cnt, 0, 1);}int main() {    //freopen("input.txt", "r", stdin);memset(dp, -1, sizeof(dp));while(scanf("%d%d", &n, &m) == 2 && n && m) {cout << cal(m)-cal(n-1) << endl;}    return 0;}

0 0
原创粉丝点击