NIIFL的博客

NIIFL的博客

[SCOI2009]windy数

题目描述

windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?

分析

基础数位dp,难点在于如何处理前导零,因为本题要求没有前导零。
当上方所有位都为零时,当前位可以不受限制
状态为f[i][j],i为哪一位,j为上一位的值,因为上一位的值对当前位方案数有影响
具体参见代码

AC代码

#include<iostream>
#include<cstdio>
#include<cstring> 
using namespace std;
const int MAXN=55;
int f[MAXN][MAXN],a[MAXN];
int abs(int x){return x<0?-x:x;} 
int dfs(int pos,int pre,bool limit,bool ling){
    if(pos==-1) return 1;
    if(!limit&&!ling&&f[pos][pre]!=-1) return f[pos][pre];
    int up=limit?a[pos]:9;
    int sum=0,p;
    for(int i=0;i<=up;i++){
        p=i;
        if(ling&&!i) p=-100;
        if(abs(i-pre)<2) continue;
        sum+=dfs(pos-1,p,limit&&i==a[pos],p==-100);
    } 
    if(!limit&&!ling) f[pos][pre]=sum;
    return sum; 
} 
int solve(int x){
    int pos=0;
    memset(f,-1,sizeof(f));
    while(x){
        a[pos++]=x%10;
        x/=10;
    }
    return dfs(pos-1,-100,true,true);
}
int main(){
    int l,r; scanf("%d%d",&l,&r);
    printf("%d\n",solve(r)-solve(l-1));
    return 0;
}
阅读更多
个人分类: 数位dp
相关热词: scoi2009
上一篇HDU 2089 不要62
下一篇Manacher算法学习笔记
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭