G - windy数 解题报告

题目链接:https://vjudge.net/contest/381753#problem/G

知识预备:数位DP
数位DP的题目往往是这样的:
给定一个闭区间[L,R],求这个区间中满足"某种条件"的数的总数量。
数位DP技巧:
技巧1:[X,Y] -> f(Y)-f(X-1)
把统计[L,R]范围满足条件的数的个数转化为统计[1,N]内满足条件的数的个数,这样,f([L,R]) = f([1,R])-f([1,L-1]) , 那么接下来讨论问题只需要考虑上边界就行了。
技巧2:树的方式来考虑
图片说明
代码实现用dfs从高位到低位枚举
解题思路:
对于这道题,dfs需要记录的状态有:
1.现在枚举第几位
2.前面一位的数字是多少
3.这一位可以填哪些数字

位置pos有两种可能性:
1.如果pos前面某一位已经小于上限数字所对应位置的数字,那么这一位可以填0-9
2.如果pos前面每一位都与上限数字所对应位置的数字相同,那么这一位只能填0-图片说明
因此,维护前面每一位是否与上限所对应位置的数字相同,就可以得到pos位枚举数字范围。
然后用一个dp[pos][pre_num]来记录,避免重复调用。
这里需要注意,!flag的情况下和flag情况下;有前导0和无前导0情况下,dp[pos][pre_num]是不同的。

代码:

#include<bits/stdc++.h>
using namespace std;
int a[30];
int dp[30][30];
int dfs(int pos, int pre, bool flag, bool lead)
{
    //lead用于判断从高位到低位枚举时有没有前导0,
    //如对1232
    //当前面几位枚举的都是0时,后面一位的枚举是不受前面一位限制的,
    //因为如果前面几位都是0,就相当于前几位是不存在的,
    //所以才有: if( abs(i-pre) >=2 || lead)
    if(!pos) return 1;
    if(dp[pos][pre] != -1&&!flag&&!lead) return dp[pos][pre];
    int ans = 0, max_num;
    if(flag) max_num = a[pos]; else max_num = 9;
    for(int i = 0; i <= max_num; i++) {
        if(abs(i-pre) >= 2 || lead) {
            ans+=dfs(pos-1, i, flag&&(i==a[pos]), lead&&(i==0));
        }
    }
    if(!flag&&!lead) dp[pos][pre] = ans;
    return ans;
}
int solve(int x)
{
    int len = 0;
    while(x) a[++len]=x%10, x/=10;
    memset(dp, -1, sizeof(dp));
    return dfs(len, -2, 1, 1);
}
int main()
{
    int l, r;
    cin >> l >> r;
    cout << solve(r)-solve(l-1) << endl;
}
2020/7/8 VJ contest 8 比赛 文章被收录于专栏

2020/7/8

全部评论

相关推荐

02-28 01:18
已编辑
南昌大学 后端工程师
后测速成辅导一两个月...:把开源经历放个人项目上边应该更好,就像大部分人都把实习经历放个人项目上边
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
8542次浏览 77人参与
# 你的实习产出是真实的还是包装的? #
1566次浏览 40人参与
# MiniMax求职进展汇总 #
23648次浏览 305人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7320次浏览 40人参与
# 简历第一个项目做什么 #
31468次浏览 323人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186755次浏览 1118人参与
# 巨人网络春招 #
11282次浏览 223人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152222次浏览 887人参与
# 研究所笔面经互助 #
118833次浏览 577人参与
# 重来一次,我还会选择这个专业吗 #
433251次浏览 3926人参与
# 简历中的项目经历要怎么写? #
309889次浏览 4181人参与
# 面试紧张时你会有什么表现? #
30463次浏览 188人参与
# 你今年的平均薪资是多少? #
212941次浏览 1039人参与
# AI时代,哪些岗位最容易被淘汰 #
63209次浏览 791人参与
# 我的求职精神状态 #
447934次浏览 3128人参与
# 你最满意的offer薪资是哪家公司? #
76375次浏览 374人参与
# 正在春招的你,也参与了去年秋招吗? #
363077次浏览 2635人参与
# 你怎么看待AI面试 #
179724次浏览 1223人参与
# 牛客AI文生图 #
21391次浏览 237人参与
# 职能管理面试记录 #
10776次浏览 59人参与
# 网易游戏笔试 #
6445次浏览 83人参与
# 腾讯音乐求职进展汇总 #
160536次浏览 1109人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务