【数位DP】bzoj1026: [SCOI2009]windy数
1026: [SCOI2009]windy数
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4163 Solved: 1864
[Submit][Status][Discuss]
Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
Input
包含两个整数,A B。
Output
一个整数。
Sample Input
【输入样例一】
1 10
【输入样例二】
25 50
1 10
【输入样例二】
25 50
Sample Output
【输出样例一】
9
【输出样例二】
20
9
【输出样例二】
20
HINT
【数据规模和约定】
100%的数据,满足 1 <= A <= B <= 2000000000 。
和hdu2089貌似没有什么区别。。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 6 using namespace std; 7 8 long long f[15][15]; 9 10 void DP() 11 { 12 for(int i=0;i<=9;i++) 13 f[1][i]=1; 14 for(int i=2;i<=12;i++) 15 for(int j=0;j<=9;j++) 16 for(int kk=0;kk<=9;kk++) 17 if(fabs(j-kk)>=2) 18 f[i][j]+=f[i-1][kk]; 19 } 20 21 long long get(long long x) 22 { 23 int len=0,num[15]; 24 long long res=0; 25 while(x) 26 { 27 num[++len]=x%10; 28 x/=10; 29 } 30 for(int i=1;i<num[len];i++) 31 res+=f[len][i]; 32 for(int i=1;i<=len-1;i++) 33 for(int j=1;j<=9;j++) 34 res+=f[i][j]; 35 for(int i=len-1;i>=1;i--) 36 { 37 for(int j=0;j<num[i];j++) 38 if(fabs(j-num[i+1])>=2)res+=f[i][j]; 39 if(fabs(num[i]-num[i+1])<2)break; 40 } 41 return res; 42 } 43 44 int main() 45 { 46 long long l,r; 47 DP(); 48 scanf("%lld%lld",&l,&r); 49 printf("%lld",get(r+1)-get(l)); 50 }