当前位置: 首页 > news >正文

HDU 3709 Balanced Number(数位DP)题解

思路:

 

之前想直接开左右两边的数结果爆内存...

枚举每次pivot的位置,然后数位DP,如果sum<0返回0,因为已经小于零说明已经到了pivot右边,继续dfs只会越来越小,且dp数组会炸

注意一下一些细节:dp开long long,注意前导零只能算一次

代码:

#include<iostream>
#include<algorithm>
#define ll long long
const int N = 50000+5;
const int INF = 0x3f3f3f3f;
using namespace std;
int dig[20];
ll dp[20][20][2000];
ll dfs(int pos,int piv,int sum,bool limit){
    if(pos == -1) return sum == 0? 1 : 0;
    if(sum < 0) return 0;
    if(!limit && dp[pos][piv][sum] != -1) return dp[pos][piv][sum];
    int top = limit? dig[pos] : 9;
    ll ret = 0;
    for(int i = 0;i <= top;i++){
        int tot;
        if(pos > piv){
            tot = sum + (pos - piv)*i;
        }
        else if(pos < piv){
            tot = sum - (piv - pos)*i;
        }
        else{
            tot = sum;
        }
        ret += dfs(pos - 1,piv,tot,limit && i == top);
    }
    if(!limit) dp[pos][piv][sum] = ret;
    return ret;
}
ll solve(ll x){
    int pos = 0;
    if(x == -1) return 0;
    while(x){
        dig[pos++] = x % 10;
        x /= 10;
    }
    ll ret = 0;
    for(int i = 0;i < pos;i++){
        ret += dfs(pos - 1,i,0,true);
    }
    return ret - pos + 1; //前导零只能算一次
}
int main(){
    int T;
    ll l,r;
    scanf("%d",&T);
    while(T--){
        memset(dp,-1,sizeof(dp));
        scanf("%lld%lld",&l,&r);
        printf("%lld\n",solve(r) - solve(l - 1));
    }
    return 0;
}


转载于:https://www.cnblogs.com/KirinSB/p/9408772.html

相关文章:

  • 【笔记】最长递增子序列 Longest increasing subsequence(LIS)
  • c# 修改xml格式config文件
  • 【知识碎片】第三方登录弹窗效果
  • VMware虚拟机中为Linux 添加虚拟硬盘(VirtualBox方法类似)
  • Robot Framwork 问题小记
  • 给MySQL增加一个表示例
  • 复变函数:复函数的空间与Montel定理
  • sed使用命令记录
  • db2模式
  • 配置企业库5.0管理
  • SuperMicro(超微)IPMI安装操作系统KVM教程-超微3U8刀服务器
  • Python cookbook笔记——求N个最大最小元素及lambda表达式
  • restful 学习地址
  • Flutter 开发一个 GitHub 客户端 | 掘金技术征文
  • brk/sbrk的使用
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • C++入门教程(10):for 语句
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • FastReport在线报表设计器工作原理
  • IDEA 插件开发入门教程
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JavaScript标准库系列——Math对象和Date对象(二)
  • maya建模与骨骼动画快速实现人工鱼
  • node和express搭建代理服务器(源码)
  • PAT A1050
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • REST架构的思考
  • spring boot下thymeleaf全局静态变量配置
  • vue的全局变量和全局拦截请求器
  • vue总结
  • XForms - 更强大的Form
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 马上搞懂 GeoJSON
  • 如何胜任知名企业的商业数据分析师?
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 一些css基础学习笔记
  • - 转 Ext2.0 form使用实例
  • Java总结 - String - 这篇请使劲喷我
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #162 (Div. 2)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (+4)2.2UML建模图
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (离散数学)逻辑连接词
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (生成器)yield与(迭代器)generator
  • (实战篇)如何缓存数据
  • (转)视频码率,帧率和分辨率的联系与区别
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程