首页 > 其他分享 >数位DP (记忆化 暴力搜索!!)

数位DP (记忆化 暴力搜索!!)

时间:2023-03-30 21:24:30浏览次数:36  
标签:const 暴力 int sum dp include top DP 数位

用于: 统计数位于数位的相关信息的计数问题, 

通常会问在某个区间内, 利用减法思维,这样就会减少一个边界的判断

此时就会只有一个边界, 这个边界 利用 lim 处理, 在暴力枚举的时候不要超过lim 就行了

记忆化搜索的过程, 就是一个完全的暴力, 不过有记忆化搜索, 所以他的时间复杂度是 DP的空间+ 点点边界内容

一般就二维dp[][], 第一个维度 是 pos, 第二个维度是 状态, 这个维度来表示什么东西来解决当前问题是核心, 具体就看模板:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define int long long

const int maxn=1000100;
const int mod=1e9+7;
int t;
int l,r;
int a[maxn],num;
int dp[200][200];

int dfs(int a(postion),int statement,bool lmt){
    
    if(!a) return  ;
    if(!lmt&&dp[x][statement]!=-1) return dp[a][statement];//最高位是0也直接返回 
    int bound=top?p[x]:9;//根据top判断枚举的上界bound 
    int ans=0;
    for(int i=0;i<=bound;i++) 
    {
        //  状态处理  
        ans += dfs(a-1,statment,lmt&&(i==bound));
        
    }

    if(!lim) dp[a][statement]=ans;
    return ans;
}

int solve(int x){
    int sum=0;
    while(x){
        p[++sum]=x%10;
        x/=10;
    }
    return dfs(sum,0,1)%mod;//从最高位开始枚举
}

signed main(){
    cin>>t;
    memset(f,-1,sizeof(f));
    while(t--){
        cin>>l>>r;
        cout<<(solve(r)-solve(l-1)+mod)%mod<<'\n';
    }
    return 0;
}
View Code

 

 例子: 

题目 :将每一个[l,r]中的数字的每一位的数加起来, L ,R <=1e18;

statement 设置为 前面几位的sum,  dp[i][sum] 表示前几位的sum时,后面一共有多个和

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define int long long

const int maxn=1000100;
const int mod=1e9+7;
int t;
int l,r;
int a[maxn],num;
int f[200][200];

int dfs(int x,int sum,bool top){//我个人认为这很像类似递归算法 
    if(!x) return sum;//如果已经到了最后一位就可以直接返回sum 
    if(!top&&f[x][sum]>=0) return f[x][sum];//最高位是0也直接返回 
    int bound=top?a[x]:9;//根据top判断枚举的上界bound 
    int ret=0;
    for(int i=0;i<=bound;i++) ret=(ret+dfs(x-1,sum+i,top&&i==bound))%mod;
    /*
        这里大概就是说,我当前数位枚举的数是i,然后根据题目的约束条件分类讨论
        去计算不同情况下的个数,这里一定要保存枚举的这个数是合法
    */ 
    if(!top) f[x][sum]=ret;//这里对应上面的记忆化,在一定条件下时记录,保证一致性,当然如果约束条件不需要考虑top,这里就是top就完全不用考虑了*
    return ret;
}

int solve(int x){
    int sum=0;
    while(x){
        a[++sum]=x%10;
        x/=10;
    }
    return dfs(sum,0,1)%mod;//从最高位开始枚举
}

signed main(){
    cin>>t;
    memset(f,-1,sizeof(f));
    while(t--){
        cin>>l>>r;
        cout<<(solve(r)-solve(l-1)+mod)%mod<<'\n';
    }
    return 0;
}
View Code

 

标签:const,暴力,int,sum,dp,include,top,DP,数位
From: https://www.cnblogs.com/Lamboofhome/p/17274337.html

相关文章

  • 线程池----ThreadPoolExecutor
    从Java5开始,Java提供了自己的线程池。线程池就是一个线程的容器,每次只执行额定数量的线程。java.util.concurrent.ThreadPoolExecutor就是这样的线程池。它很灵活,但使用起来也比较复杂,本文就对其做一个介绍。首先是构造函数。以最简单的构造函数为例:publicThreadPoolExecuto......
  • dos批处理中%~dp0%的说明
    原文:(49条消息)dos批处理中%~dp0%的说明_批处理%~dp0后面的文本_Crett的博客-CSDN博客%~dp0“d”为Drive的缩写,即为驱动器,磁盘、“p”为Path缩写,即为路径,目录cd是转到这个目录,使用/D开关,除了改变驱动器的当前目录之外,还可改变当前驱动器。选项语法:~0-删除任何引号("),扩......
  • CF1295E Permutation Separation 题解 线段树优化dp
    题目链接:https://codeforces.com/problemset/problem/1295/E题目大意:将排列\(p_1,p_2,\ldots,p_n\)先分成\(p_1,\ldots,p_k\)与\(p_{k+1},\ldots,p_n\)两个......
  • Python ThreadPoolExecutor的简单使用
    pythonThreadPoolExecutor的简单使用一、前言Python3.2以后,官方新增了concurrent.futures模块,该模块提供线程池ThreadPoolExecutor和进程池ProcessPoolExecutor。使用......
  • CentOS7系统放行TCP/UDP端口教程
    在使用CentOS7操作系统时,您需要放行某些端口,以便应用程序能够正常运行。下面是如何放行TCP/UDP端口的步骤。步骤1:SSH连接服务器使用SSH方式连接服务器,如果您不知道如何SSH......
  • CF1809G prediction - dp - 组合数学 -
    题目链接:https://codeforces.com/contest/1809/problem/G题解:一道很强的dp首先翻译条件:predictable是什么意思?发现就是对每一个下标,前缀max和下一个位置至少差一个......
  • R语言Kmeans聚类、PAM、DBSCAN、AGNES、FDP、PSO粒子群聚类分析iris数据结果可视化比
    全文链接:http://tecdat.cn/?p=32007原文出处:拓端数据部落公众号本文以iris数据和模拟数据为例,帮助客户了比较R语言Kmeans聚类算法、PAM聚类算法、DBSCAN聚类算法、AGNE......
  • 最长回文字串之暴力解法
    最长回文字串是一个典型的算法问题,首先要搞清楚什么是回文。回文,故名思义就是对称的文字,比如“ABA”,比如“ABABC”中的“AB“。题目如下:给你一个字符串s,找到s中最长......
  • buu [CISCN] BadProgrammer题解
    [CISCN]BadProgrammer页面很长,有很多的按钮,但是点了之后都没反应查看源码、扫描打开到具体目录一个个目录点开看,在static/下找到了一个flag.ejs文件下载,打开......
  • 神策数据:五步构建企业 CDP 全域用户关联数据体系
    企业CDP即企业客户数据平台,可以帮助企业实现全域用户数据采集和数据管理,使企业能够更加全面地洞察用户行为、深入分析用户需求,最终通过自动化营销方式为用户提供个性化体......