windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
标签:
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
包含两个整数,A B。
一个整数。
【数据规模和约定】
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 }
【数位DP】bzoj1026: [SCOI2009]windy数
标签:
原文地址:http://www.cnblogs.com/tuigou/p/4832754.html