[bzoj1026] [SCOI2009]windy數
阿新 • • 發佈:2019-02-09
mat isdigit int fin 一個 包括 數位 sample span
Description
windy定義了一種windy數。不含前導零且相鄰兩個數字之差至少為2的正整數被稱為windy數。 windy想知道,在A和B之間,包括A和B,總共有多少個windy數?
Input
包含兩個整數,A B。
Output
一個整數
Sample Input
25 50
Sample Output
20
Solution
數位\(dp\)入門題。
\(f[i][j]\)表示\(i\)位,最高為是\(j\)的方案數。
然後貼著上界算答案就好了。
#include<bits/stdc++.h> using namespace std; void read(int &x) { x=0;int f=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f; } #define write(x) printf("%d\n",x) const int maxn = 2e5+10; int f[30][12],r[30]; int calc(int n) { int d=0,x=n,ans=0; while(x) r[++d]=x%10,x/=10; for(int i=1;i<d;i++) for(int j=1;j<=9;j++) ans+=f[i][j]; for(int i=1;i<r[d];i++) ans+=f[d][i]; for(int i=d-1;i;i--) { for(int j=0;j<r[i];j++) if(abs(j-r[i+1])>=2) ans+=f[i][j]; if(abs(r[i+1]-r[i])<2) break; if(i==1) ans++; }return ans; } int main() { for(int i=0;i<=9;i++) f[1][i]=1; for(int i=2;i<=15;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]; int a,b;read(a),read(b),write(calc(b)-calc(a-1)); return 0; }
[bzoj1026] [SCOI2009]windy數