P2657 [SCOI2009] windy 数

原题链接

题解

一个细节坑我好久

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll f[15][15]={0};//从最高位第i位数字为j时的数字里有多少windy数
ll solve(ll now)
{
    now++;//小于等于变小于
    ll len=0;
    ll num[15]={0};
    while(now)
    {
        len++;
        num[len]=now%10;
        now/=10;
    }
    ll sum=0;

    for(int i=len;i>=2;i--)
    {
        for(int j=1;j<=9;j++) sum+=f[i-1][j];
    }

    for(int i=1;i<num[len];i++) sum+=f[len][i];

    for(int i=len-1;i>=1;i--)
    {
        for(int k=0;k<num[i];k++) if(abs(num[i+1]-k)>=2)sum+=f[i][k];
        if(abs(num[i]-num[i+1])<2) break;//细节 
    }


    return sum;
}

int main()
{

    for(int i=0;i<=9;i++) f[1][i]=1;
    for(int i=2;i<=10;i++)
    {
        for(int j=0;j<=9;j++)
        {
            for(int k=0;k<=9;k++)
            {
                if(abs(k-j)>=2) f[i][j]+=f[i-1][k];
            }
        }
    }


    ll a,b;
    cin>>a>>b;
    cout<<solve(b)-solve(a-1);

    return 0;
}

posted @ 2024-04-06 19:58  纯粹的  阅读(15)  评论(0)    收藏  举报