【hdu2809】 不要62

http://acm.hdu.edu.cn/showproblem.php?pid=2089 (题目链接)

题意

  求区间${[n,m]}$中不含有62和4的数的个数。

Solution

  数位dp板子。

代码

// hdu2089
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<ctime>
#define LL long long
#define inf (1ll<<30)
#define MOD 1004535809
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;

int t[10],f[10][10],g[10];
int ans,a[2],n;

void solve(int p) {
	for (n=0;a[p];a[p]/=10) t[++n]=a[p]%10;
	memset(f,0,sizeof(f));memset(g,0,sizeof(g));
	if (t[1]!=4) g[1]=1;
	for (int i=0;i<10;i++) if (i!=4) f[1][i]=1;
	for (int i=2;i<=n;i++) {
		for (int j=0;j<10;j++) {
			if (j==4) continue;
			for (int k=0;k<10;k++)
				if (j!=6 || k!=2) f[i][j]+=f[i-1][k];
		}
		if (t[i]==4) continue;
		for (int k=0;k<t[i-1];k++) if (t[i]!=6 || k!=2) g[i]+=f[i-1][k];
		if (t[i]!=6 || t[i-1]!=2) g[i]+=g[i-1];
	}
	if (!p) p=-1;
	for (int i=1;i<n;i++)
		for (int j=1;j<10;j++) ans+=p*f[i][j];
	for (int i=1;i<t[n];i++) ans+=p*f[n][i];
	ans+=p*g[n];
}
int main() {
	while (scanf("%d%d",&a[0],&a[1])!=EOF) {
		if (!a[0] && !a[1]) break;
		a[0]--;ans=0;
		solve(0);solve(1);
		printf("%d
",ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/MashiroSky/p/6396150.html