SCOI-2009 windy数(数位DP)

题意:给定一个区间[a,b],求相邻两个数字之差至少为2的数的个数。

数位DP,status保存上一个数是什么即可,注意前导零。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
using namespace std;
int dp[13][13];
int num[13];

int dfs(int k,int las,bool ismax)   //las为12表示前面均为0
{
	if(k==0)return 1;
	if(!ismax && dp[k][las]!=-1)return dp[k][las];
	int maxer=ismax?num[k]:9,res=0;
	FOR(i,0,maxer)
	    if(abs(i-las)>=2)
			res+=dfs(k-1,las==12&&i==0?12:i,ismax&&i==maxer);
	if(!ismax)dp[k][las]=res;
	return res;
}
int solve(int k)
{
	int p=0;
	while(k)
	{
		num[++p]=k%10;
		k/=10;
	}
	return dfs(p,12,1);
}

int main()
{
	int A,B;
	memset(dp,-1,sizeof(dp));
	scanf("%d%d",&A,&B);
	printf("%d\n",solve(B)-solve(A-1));
	return 0;
}

猜你喜欢

转载自blog.csdn.net/paulliant/article/details/80331588