[SCOI2009]windy数

题目

洛谷
BZOJ

做法

一眼题系列打半天结果循环写反了

套路:
(1、)预处理(dp[i][j])(i)位为(j)的方案数
(2、Solve(r)-Solve(l-1))
(~~~~)(高位不动处理低位,最高位(1)~(x-1),前导(0)情况)

My complete code

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL l,r;
LL dp[15][10],a[15];
inline void Calc(){
	for(LL i=0;i<=9;++i) dp[1][i]=1;
	for(LL i=2;i<=10;++i)
	    for(LL j=0;j<=9;++j)
	        for(LL k=0;k<=9;++k)
	            if(abs(j-k)>=2) 
				    dp[i][j]+=dp[i-1][k];
}
inline LL Solve(LL x){
	LL len(0),tmp(x),ret(0);
	while(tmp) a[++len]=tmp%10,tmp/=10;
	for(LL i=len-1;i>=1;--i){
	    for(LL j=0;j<a[i];++j) 
		    if(abs(j-a[i+1])>=2)
			    ret+=dp[i][j];
		if(abs(a[i]-a[i+1])<2) break;
	} 
	for(LL i=1;i<a[len];++i) ret+=dp[len][i];
	for(LL i=1;i<len;++i) 
	    for(LL j=1;j<=9;++j)
		    ret+=dp[i][j];
	return ret;
}
int main(){
	Calc();
	scanf("%lld%lld",&l,&r);
	printf("%lld",Solve(r+1)-Solve(l));
	return 0;
}
原文地址:https://www.cnblogs.com/y2823774827y/p/10385132.html