HDU2089 不要62 BZOJ1026: [SCOI2009]windy数 [数位DP]

本文深入探讨了深度优先搜索(DFS)算法的应用场景,并通过具体示例展示了如何使用DFS解决复杂问题。文章提供了详细的代码实现及技巧说明,帮助读者更好地理解和运用DFS。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基础题复习
这次用了dfs写法,感觉比较好

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=10;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

int r, l, a[N], len;
int f[N][2];
int dfs(int d, bool flag, bool sky) { //printf("dfs %d %d %d\n",d,flag,sky);
    if(d==0) return 1;
    if(!sky && f[d][flag]!=-1) return f[d][flag];
    int now=0, lim = sky ? a[d] : 9;
    for(int i=0; i<=lim; i++) {
        if(i==4 || (flag && i==2)) continue;
        now += dfs(d-1, i==6, i==lim && sky);
    }
    return sky ? now : f[d][flag]=now;
}
int cal(int n) {
    len=0;
    while(n) a[++len]=n%10, n/=10;
    return dfs(len, 0, 1);
}
int main() {
    freopen("in","r",stdin);
    memset(f, -1, sizeof(f));
    while(true) {
        l=read(); r=read();
        if(l==0 && r==0) break;
        printf("%d\n", cal(r)-cal(l-1));
    }
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=15;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}

int l, r, a[N], len;
int f[N][N];
int dfs(int d, int last, bool zero, bool sky) { //printf("Dfs %d %d  %d\n",d,last,sky);
    if(d==0) return 1;
    if(!sky && !zero && f[d][last]!=-1) return f[d][last];
    int now=0, lim = sky ? a[d] : 9; //printf("lim %d\n",lim);
    for(int i=0; i<=lim; i++) 
        if(zero || abs(i-last)>=2) now += dfs(d-1, i, zero && i==0, sky && i==lim);
    return (sky||zero) ? now : f[d][last]=now;
}
int cal(int n) {
    len=0;
    while(n) a[++len]=n%10, n/=10;
    return dfs(len, 0, 1, 1);
}
int main() {
    freopen("in","r",stdin);
    memset(f,-1,sizeof(f));
    //for(int i=0; i<=50; i+=10) printf("hi %d  %d \n",i,cal(i));
    //printf("hi %d %d\n",24,cal(24));
    l=read(); r=read();
    printf("%d\n", cal(r)-cal(l-1));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值