BZOJ 1026 数位dp
1026: [SCOI2009]windy数
题意:windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
tags:不知道怎么说,还是直接看代码吧
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define FF(i,a,b) for (int i=a;i<=b;i++) #define F(i,b,a) for (int i=b;i>=a;i--) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f typedef long long ll; const int N = 2e5+10; int a, b; ll dp[12][11]; void Init() { FF(j,0,9) dp[1][j]=1; FF(i,2,10) FF(j,0,9) FF(l,0,9) { //j要处理到0 if(abs(j-l)>=2) dp[i][j]+=dp[i-1][l]; } } ll cal(int x) { ll ans=0; int di[12], k=0; while(x) di[++k]=x%10, x/=10; FF(i,1,k-1) FF(j,1,9) ans+=dp[i][j]; FF(j,1,di[k]-1) ans+=dp[k][j]; F(i,k-1,1) { FF(j,0,di[i]-1) if(abs(di[i+1]-j)>=2) ans+=dp[i][j]; //不会处理到x本身 if(abs(di[i+1]-di[i])<2) break; } return ans; } int main() { scanf("%d%d", &a, &b); Init(); printf("%lld\n", cal(b+1)-cal(a)); return 0; }