hdu2089 不要62(暴力打表计数,数位DP)

Problem Description
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
 

Input
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。
 

Output
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
 

Sample Input
   
   
   
   
1 100 0 0
 

Sample Ou tput
   
   
   
   
80
解题报告:
这个题有两种方法,因为只有100w,所以暴力法不会TLE。打表计数就是先把已经算出来的结果存在数组里面,避免重复计算。符合条件的数组元素的值为1,不符合条件的为0.最后取的时候只用输出符合条件的即可。
上代码:
#include <cmath>
#include <ctime>
#include <cctype>
#include <climits>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <sstream>
#include <iostream>
#include <algorithm>

#define INF (INT_MAX / 10)
#define clr(arr, val) memset(arr, val, sizeof(arr))
#define pb push_back
#define sz(a) ((int)(a).size())

using namespace std;
typedef set<int> si;
typedef vector<int> vi;
typedef map<int, int> mii;
typedef pair<int, int> pii;
typedef long long ll;

const double esp = 1e-5;

#define N 50100
int a[1000000];
int main()
{
	int n,m,i,t,j;
	memset(a,0,sizeof(a));
	for(i=1;i<1000000;i++)
	{
		t=i;
		j=0;
		while(t)
		{
			j=0;
			if(t%10==4||t%100==62)
			{
				j=1;
				break;
			}
			t/=10;
		}
		if(j==1)
		a[i]=1;
	}
	while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0)
	{
		int count=0;
		for(i=n;i<=m;i++)
		{
			if(a[i]==0)
			count++;
		}
		printf("%d\n",count);
	}	
	return 0;
} 


还有一种数位dp:

你可能感兴趣的:(dp,HDU,暴力打表)