P2657 [SCOI2009]windy数 数位dp入门

参考了题解,理解仍然还不够透彻

#include<bits/stdc++.h>
using namespace std;
const int N=550;
const int maxn=1e6+7;
int num[maxn];
int dp[N][N];
int a,b;
int dfs(int len,int pre,bool flag,bool zero)
{
    if(len==0)
    {
        return 1;
    }
    if(!zero&&!flag&&dp[len][pre]!=-1)
    {
        return dp[len][pre];
    }
    int p,cnt=0,maxx=(flag?num[len]:9);
    for(int i=0;i<=maxx;i++)
    {
        if(abs(i-pre)<2)
        {
            continue;
        }
        p=i;
        if(zero&&i==0)
        {
            p=-233;
        }
        cnt+=dfs(len-1,p,(flag)&&(i==maxx),(p==-233));
    }
    if(!flag&&!zero)
    {
        dp[len][pre]=cnt;
    } 
    return cnt;
}
int solve(int x)
{
    int k=0;
    while(x)
    {
        num[++k]=x%10;
        x/=10;
    }
    memset(dp,-1,sizeof(dp));
    return dfs(k,-233,true,true);
}
int main()
{
    scanf("%d%d",&a,&b);
    printf("%d",solve(b)-solve(a-1));
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/LJB666/p/10817108.html