1 条题解

  • 0
    @ 2023-10-18 10:01:01

    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
    上传者