首页 > 其他分享 >20230719-动态规划DP

20230719-动态规划DP

时间:2023-07-20 14:36:16浏览次数:41  
标签:int ll 20230719 st sum 动态 id DP

20230719

数位DP

P4127 [AHOI2009] 同类分布

题目描述

传送门
求出 [a,b] 中各位数字之和能整除原数的数的个数 \(a,b ≤ 1e18\)

Solution

对于这种求是否能整除的题
我们只有在最后才能得到答案

这道题很明显是数位DP
考虑用记忆化搜索来实现
对于每一位我们需要维护前面的数字之和和前面所组成的数
而由于前面所组成的数太大了,可以到达\(1e18\)
但是数字之和又一定\(\le 9* 18\)

我们就考虑取模数
这样进行\(9 * 18\)次dfs即可
每一次要判断数字之和\(=mod\)
这样记录答案就可以了

H_W_Y-Coding
#include <bits/stdc++.h>
using namespace std;
#define ll long long

ll a,b,mod,dp[20][185][185];
int len=0,p[20];

ll dfs(int id,int sum,ll st,int limit){
  if(id>len) return st==0&&sum==mod?1:0;
  if(!limit&&dp[id][sum][st]!=-1) return dp[id][sum][st];
  int u=limit?p[id]:9;
  ll res=0;
  for(int i=0;i<=u;i++)
    res+=dfs(id+1,sum+i,(st*10+i)%mod,limit&&i==u);
  if(!limit) dp[id][sum][st]=res;
  return res;
}

ll solve(ll x){
  len=0;
  while(x){
  	p[++len]=x%10;
  	x/=10;
  }
  ll res=0;
  for(int i=1;i<=len/2;i++) swap(p[i],p[len-i+1]);
  for(mod=1;mod<=9*len;mod++){
    memset(dp,-1,sizeof(dp));
    res+=dfs(1,0,0,1);
  }
  return res;
}

int main(){
  /*2023.7.19 H_W_Y P4127 [AHOI2009] 同类分布 数位DP*/ 
  scanf("%lld%lld",&a,&b);
  printf("%lld\n",solve(b)-solve(a-1));
  return 0;
}

标签:int,ll,20230719,st,sum,动态,id,DP
From: https://www.cnblogs.com/hewanying0622/p/17568298.html

相关文章

  • acwing选数异或 dp
    题目链接:https://www.acwing.com/problem/content/description/4648/题解链接[转载]:https://www.acwing.com/solution/content/137064/1#include<iostream>2#include<algorithm>3#include<vector>4#include<string>5#include<queue>......
  • TCP和UDP协议的区别
    1、TCP是面向连接的,而UDP是无连接的协议。2、TCP对于传输有用的数据非常可靠,因为它需要确认发送的信息,并且能重新发送丢失的数据包;UDP是一种不可靠的协议,数据包丢失,它不会请求重新传输,目标计算机会收到损坏的数据3、TCP速度较慢,但更健壮,因为TCP在传输数据之前建立连接,并确保数据......
  • python udp settimeout
    PythonUDPsettimeout实现步骤为了帮助你理解和实现Python的UDPsettimeout功能,我将提供以下步骤。首先,我们将了解UDP和settimeout的概念,然后讨论如何在Python中使用它们。UDP简介UDP(UserDatagramProtocol)是一种无连接的传输协议,它在网络中负责将数据包从一个主机发送到另一......
  • python threadpool
    Python线程池详解在并发编程中,线程池是一种常见的设计模式,它可以提高程序的性能和响应能力。Python中有许多库可以实现线程池,其中最常用的是concurrent.futures模块中的ThreadPoolExecutor类。本文将介绍Python线程池的工作原理、使用方法和一些示例代码。什么是线程池?线程池是......
  • SSO2.0 28-20230719
                      ......
  • Matlab马尔可夫区制转换动态回归模型估计GDP增长率|附代码数据
    原文链接:http://tecdat.cn/?p=19918最近我们被客户要求撰写关于马尔可夫区制转换动态回归的研究报告,包括一些图形和统计输出。本文估计实际GDP增长率的两状态Markov区制转换动态回归模型  ( 点击文末“阅读原文”获取完整代码数据******** )。创建模型进行估计通过指定转移......
  • 20230705-动态规划DP 2
    20230705单调队列优化DPHDU3401Trade题目大意传送门有T天,第i天买股票花Api元,卖股票花Bpi元,最多能买Asi股,能卖Bsi股。任何时候股票持有量不得超过MaxP,且两个交易日至少要间隔W天。若开始时有无限块钱,最后最多能赚多少钱?(你都有无限块钱了怎么赚都不会增加啊)0<=W<T<......
  • 20230703-动态规划DP 1
    20230703热身题目求长度为n的合法括号序列有多少个,对\(10^9+7\)取模。\(n\)为偶数,\(n\le10^6\)。Solution可以维护一个栈遇到一个左括号就加入栈而遇到右括号时就取栈顶的左括号与它配对出栈一个合法序列需要保证:最后栈为空,即所有的左括号都和有括号配对了中间不能出......
  • WordPress数据表结构
    如果是一个普通的用户,不需要了解wordpress数据库的结构。但是,如果你正在写一个插件,你应该会对wordpress如何处理它的数据和关系感兴趣。如果你已经尝试使用已经存在的wordpressapi去访问你需要的数据,但不直接访问数据库的情况下,这是不可能的,WordPress的提供WPDB的类,使这项任务变......
  • DP: 0-1背包,完全背包
    见:『一文搞懂完全背包问题』从0-1背包到完全背包,逐层深入+推导-零钱兑换-力扣(LeetCode)0-1背包:dp[i][w]=minmax(dp[i-1][w],dp[i-1][w-wi]+vi)完全背包dp[i][w]=minmax(dp[i-1][w],dp[i][w-wi]+vi)即完全背包可以是重复选。另外,通常可以简化2D数组到1D,因为......