HDU2089 不要62

挺水的一道数位dp

我们只需要考虑上一位是不是6,是六的话当前位就不能填2,然后4直接跳过,记搜一发就好了

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int num[10],f[10][10];
inline int dfs(int p,int la,bool jud)
{
	if (!p) return 1;
	if (!jud&&f[p][la]!=-1) return f[p][la];
	int emm=jud?num[p]:9,ans=0;
	for (int i=0;i<=emm;i++)
	{
		if (i==4) continue;
		if (la==6&&i==2) continue;
		if (jud) ans+=dfs(p-1,i,jud&&(i==emm));
		else ans+=dfs(p-1,i,0);
	}
	if (!jud) f[p][la]=ans;
	return ans;
} 
inline int slove(int a,int b)
{
	int len=0;
	memset(f,-1,sizeof(f));
	while (a) num[++len]=a%10,a/=10;
	int ans=dfs(len,0,1);
	int lon=0;
	memset(f,-1,sizeof(f));
	while (b) num[++lon]=b%10,b/=10;
	int que=dfs(lon,0,1);
	return ans-que;
}
signed main()
{
	int l,r;
	while (~scanf("%d%d",&l,&r)&&l&&r) cout<<slove(r,l-1)<<endl;
	return 0;	
} 

猜你喜欢

转载自blog.csdn.net/ACerAndAKer/article/details/81735335