现在的位置: 首页 > 综合 > 正文

HDU 2089 数位DP

2014年07月19日 ⁄ 综合 ⁄ 共 705字 ⁄ 字号 评论关闭
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int l, r;
/*
 *  0 不包含62
 *  1 以2开头不包含62
 *  2 包含62
 */
int dp[11][3], f[11];
void init() {
	int i, j;
	f[0] = 1;
	for(i = 0; i <= 9; i++) f[i] = f[i-1] * 10;
	dp[0][0] = 1;
	for(i = 1; i <= 9; i++) {
		dp[i][0] = dp[i-1][0] * 9 - dp[i-1][1];
		dp[i][1] = dp[i-1][0];
	//	dp[i][2] = dp[i-1][1] + dp[i-1][2] * 9;
	}
}
int gao(int n) {
	int a[11], len = 0;
	while(n) {a[len++] = n%10; n/=10; }
	int i, j, ans = 0; a[len] = 0;
	bool flag = 0;
	for(i = len-1; i >= 0; i--) {
		for(j = 0; j < a[i]; j++) {
			if(flag || (a[i+1] == 6 && j == 2) || j == 4 ) continue;
			if(j == 6) ans += dp[i][0]-dp[i][1];
			else ans += dp[i][0];
		}
		if(a[i] == 4 || (a[i+1] == 6 && a[i] == 2)) flag = 1;
	}
	if(!flag) ans++;
	return ans;
}
int main() {
	int i, j;
	init();
	while( cin >> l >> r) {
		if(!l && !r) break;
		cout << gao(r) - gao(l-1) << endl;
	}
	return 0;
}

抱歉!评论已关闭.