[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;
}
posted @ 2019-02-15 18:10  y2823774827y  阅读(143)  评论(0编辑  收藏  举报