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

1026:[SCOI2009]windy数 (数位DP)

2018年04月24日 ⁄ 综合 ⁄ 共 715字 ⁄ 字号 评论关闭
#include<bits/stdc++.h>
using namespace std;
int a,b,f[15][15],base[15];
inline void ini(){
	base[1]=1;
	for(int i=2;i<=10;i++)
		base[i]=base[i-1]*10;
	for(int i=0;i<=9;i++)f[1][i]=1;
	for(int i=2;i<=10;i++)
		for(int j=0;j<=9;j++)
			for(int k=0;k<=9;k++)
				if(abs(j-k)>=2)f[i][j]+=f[i-1][k];
}
inline int calc(int n){
	if(!n)return 0;
	int res=0,len=10;
	while(base[len]>n)len--;
	for(int i=1;i<len;i++)
		for(int j=1;j<=9;j++)
			res+=f[i][j];
	int cur=n/base[len],pre=cur;
	for(int i=1;i<cur;i++)res+=f[len][i];
	n%=base[len];
	for(int i=len-1;i;i--){
		cur=n/base[i];
		for(int j=0;j<cur;j++)
			if(abs(pre-j)>=2)res+=f[i][j];
		if(i==1&&abs(pre-cur)>=2)res+=f[i][cur];
		if(abs(cur-pre)<2)break;
		pre=cur;n%=base[i];
	}
	return res;
}
int main(){
	scanf("%d%d",&a,&b);ini();
	printf("%d",calc(b)-calc(a-1));
}

抱歉!评论已关闭.