P2657 [SCOI2009] windy 數

纯粹的發表於2024-04-06

原題連結

題解

一個細節坑我好久

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;
}

相關文章