标签:
windy定义了一种windy数。
不含前导零且相邻两个数字之差至少为
windy想知道,在
包含两个整数,
满足
Sample Input | Sample Output |
---|---|
1 10 |
9 |
#include<map> #include<string> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<queue> #include<vector> #include<iostream> #include<algorithm> #include<bitset> #include<climits> #include<list> #include<iomanip> #include<stack> #include<set> using namespace std; int dp[20][20]; char s[20]; int work(int x) { if(x==0)//因为题目是不考虑0的 return 0; sprintf(s,"%d",x); int ans=0,len=strlen(s); for(int i=1;i<len;i++) for(int j=1;j<10;j++) ans+=dp[i][j];//加上长度小于x的所有情况 for(int i=1;i<s[0]-'0';i++) ans+=dp[len][i];//考虑长度跟x相同时的情况 bool flag=1; for(int i=1;flag&&i<len;i++) { for(int j=0;j<s[i]-'0';j++) if(abs(s[i-1]-'0'-j)>=2) ans+=dp[len-i][j];//可以就算进去 if(flag&&abs(s[i-1]-s[i])<2) flag=0;//后面的肯定也非法,不用算了 } if(flag)//考虑自己 ans++; return ans; } int main() { for(int i=0;i<10;i++) dp[1][i]=1; for(int i=2;i<11;i++) for(int j=0;j<10;j++) for(int k=0;k<10;k++) if(abs(j-k)>=2) dp[i][j]+=dp[i-1][k]; int a,b; while(cin>>a>>b) cout<<work(b)-work(a-1)<<endl; }
标签:
原文地址:http://blog.csdn.net/stl112514/article/details/45176749