今天刷的数位dp 第一题看了题解以后知道了数位dp的基本板子,写数位dp的方式(运用记忆化递归的方法)已经基本固定。

那么接下来的难点主要还是对于题目描述的问题,如何抽象成dp中的状态。就今天刷的题来看,dp数组第一维一般为第i位数,这是数位dp的一般表示数的方式。而数组究竟还要加几维就要看题目要求的东西。

如下题:

http://acm.hdu.edu.cn/showproblem.php?pid=3709

题意即求:

对于某个 number,你可以 fix a pivot 在某位,然后如果分成的左右两部分的 sigma(d[i] * | i - fixloc |)相等,则它是 Balanced Number。

统计区间 [a,b] 中Balance Number 的个数。(引用https://blog.csdn.net/dgq8211/article/details/9302069)

这个题目问的是满足条件的最大总数。故dp数组(不管几维)=当前状态的最大总数。

那么问题用数位dp 关注数字本身属性的思想,可以抽象出一个状态即支点的位置[x]。

//除此,与问题结果直接相关的即支点两端的力矩差[sum]。

因为数位dp是(貌似dp都是)枚举所有情况再找到最优解的,所以一定会有一个状态为问题所要求满足的东西。以该题看,条件要求满足的就是支点两边的力矩差=0,那么力矩差就一定是dp数组里的一维了。

综上两个状态发现最大总数就是各个点为支点所有满足力矩差为0的情况的总和sum。

可以将所有的情况列出。此时思考dp数组结束,即dp[pos][x][sum]。

找到正确的dp数组后就可以开心的套板子再调整细节等AC了~~~

(这题AC代码可以从上面的链接看,我偷懒不发了)

其实如果能将问题抽象为数学函数那么能更加直观的发现状态,如题目要求找到(0,n)上所有能被13整除的数的总数那满足要求的x=cigma(n%13==0) dp数组即cigma(),状态就是数n和n%13,(也就是自变量和与自变量相关的运算)。

可得dp[pos][13]。

#include<cstdio>
#include<cstring>
int dp[][];
int digit[];
int n;
int dfs(int pos,int mod ,int limit)
{
if(pos==-)return mod==;
if(!limit&&dp[pos][mod]!=-)return dp[pos][mod];
int tmp=,mm,;
int up=limit?digit[pos]:;
for(int i=;i<=up;i++)
{
mm=(mod*+i)%;
tmp+=dfs(pos-,mm,limit&&i==digit[pos]);
}
if(!limit)dp[pos][mod]=tmp;
return tmp;
}
int solve(int x)
{
int k = x;
int pos = ;
while(k)
{
digit[pos++]=k%;
k/=;
}
return dfs(pos-,,);
}
int main()
{
memset(dp,-,sizeof(dp));
while(~scanf("%d",&n))
{
printf("%d\n",solve(n));
}
return ;
}

数位dp对于状态描述与发现的一些感悟的更多相关文章

  1. Codeforces Round #235 (Div. 2) D. Roman and Numbers (数位dp、状态压缩)

    D. Roman and Numbers time limit per test 4 seconds memory limit per test 512 megabytes input standar ...

  2. HDU 4352 XHXJ's LIS (数位DP+LIS+状态压缩)

    题意:给定一个区间,让你求在这个区间里的满足LIS为 k 的数的数量. 析:数位DP,dp[i][j][k] 由于 k 最多是10,所以考虑是用状态压缩,表示 前 i 位,长度为 j,状态为 k的数量 ...

  3. hdu4352 XHXJ's LIS(数位DP + LIS + 状态压缩)

    #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the entire ...

  4. HDU 4352 XHXJ&#39;s LIS(数位dp&amp;状态压缩)

    题目链接:[kuangbin带你飞]专题十五 数位DP B - XHXJ's LIS 题意 给定区间.求出有多少个数满足最长上升子序列(将数看作字符串)的长度为k. 思路 一个数的上升子序列最大长度为 ...

  5. 咕咕(数位dp+AC自动机)

    咕咕(数位dp+AC自动机) 若一个字符串的字符集合是0~m-1,那么称它为m进制字符串.给出n个m进制字符串\(s_i\),每个字符串的权值为\(v_i\).对于另一个m进制字符串\(S\),设\( ...

  6. Balanced Number HDU - 3709 数位dp

    题意: 给出范围 算出 满足  选取一个数中任一一个 树作为支点  两边的数分别乘以到中心的距离和 左和等于右和   的数有多少个 数位DP题 状态转移方程为dp[pos][x][state]=dp[ ...

  7. BZOJ 4521 CQOI 2016 手机号码 数位DP

    4521: [Cqoi2016]手机号码 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 539  Solved: 325[Submit][Status ...

  8. 牛客多校第七场H Pair 数位dp理解

    Pair 题意 给出A B C,问x取值[1,A]和y取值[1,B]存在多少组pair<x,y>满足以下最小一种条件,\(x \& y >c\),\(x\) xor \(y& ...

  9. 【HDU 4352】 XHXJ's LIS (数位DP+状态压缩+LIS)

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. Java之解决线程安全问题的方式三:Lock锁

    import java.util.concurrent.locks.ReentrantLock; /** * 解决线程安全问题的方式三:Lock锁 --- JDK5.0新增 * * 1. 面试题:sy ...

  2. Java架构师笔记-你必须掌握的 21 个 Java 核心技术!(干货)

    闲来无事,师长一向不(没)喜(有)欢(钱)凑热闹,倒不如趁着这时候复盘复盘.而写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,希望可以给大家一些经验,能让大家更好学习和使用Jav ...

  3. 如何优雅的设计APP页面?

    页面框架设计只是整个产品设计中的一环,不要把眼界局限在这一环,也不要只站需求.只站在交互.只站在视觉上思考问题,从多个角度看问题,你才会学会成长. 产品设计是一个系统工程,单独拧出来其中一个流程来讲, ...

  4. Intellij IDEA中mybatis-generator自动生成

    一.在maven工程中的resource中创建generatorConfig.xml 二.配置generatorConfig.xml: <?xml version="1.0" ...

  5. 问题:pip命令安装好的库,pycharm却显示没有这个库

    问题: 今天发现pycharm内部安装库出了问题,导致无法安装各种库,我就在cmd下用自己安装好的pip安装各个库,成功安装后发现各个库在idle中可以成功的import,但在pycharm里却显示没 ...

  6. Opencv笔记(九)——图像阈值

    学习目标: 学习简单阈值,自适应阈值,Otsu's 二值化等 学习函数cv2.threshold,cv2.adaptiveThreshold 等. 一.简单阈值 与名字一样,这种方法非常简单.但像素值 ...

  7. 47)PHP,数据库多表连接

    https://www.w3cschool.cn/mysql/56ik1sqv.html

  8. mysql按表字段内容长度排序

    今天遇到个需求如下: 查询一下新的业务是否正常入库,遇到的问题是新旧业务用的是同一个字段标识,唯一不同的是字段里内容的长度不同 查询方式如下,mysql按表字段内容长度排序 SELECT * FROM ...

  9. Java源码之ArrayList

    本文源码均来自Java 8 总体介绍 Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类.Set和List两个类继承于它.Set中不能包含重复的元素,也没有顺序来存放. ...

  10. gpio 的配置

    1.时钟使能 B引脚RCC时钟脉冲启动.|(或)表示只要第三个为1就行. 也可以写为RCC_APB2ENR  | = 0X0008; 2.配置GPIO的输出模式以及速度 3 . 如果是 0号引脚:GP ...