1 条题解
-
0
C++ :
#include<bits/stdc++.h> using namespace std; const int N=20; int f[N][N]; void init() { for(int i=0;i<=9;i++) f[1][i]=1; for(int i=2;i<N;i++) { for(int j=0;j<=9;j++) //枚举第i位 { for(int k=0;k<=9;k++) //枚举第i-1位 { if(abs(j-k)>=2) //Windy数特性 { f[i][j]+=f[i-1][k]; } } } } } int dp(int n) { if(!n) return 0; //0不是正整数 vector<int> nums; while(n) { nums.push_back(n%10); n/=10; } int res=0,last=-1; //last 表示上一位的数 for(int i=nums.size()-1;i>=0;i--) { int x=nums[i]; for(int j=0;j<x;j++) { if(abs(j-last)>=2) //符合条件 { res+=f[i+1][j]; } } if(abs(x-last)<2) break; //右边分支不符合 last=x; if(!i) res++;//这个数符合条件 } //计算有前导零的情况 //153 53 3 for(int i=nums.size()-1;i>=1;i--) { for(int j=1;j<=9;j++) { res+=f[i][j];//累加方案 } } return res; } int main() { init(); int l,r; cin>>l>>r; cout<<dp(r)-dp(l-1)<<endl; return 0; }
- 1
信息
- ID
- 771
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者