博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Hdu3652]B-number(数位DP)
阅读量:6323 次
发布时间:2019-06-22

本文共 943 字,大约阅读时间需要 3 分钟。

Description

题目大意:求小于n是13的倍数且含有'13'的数的个数。

(1 <= n <= 1000000000)

Solution

数位DP,题目需要包含13,且被13整除,所以状态应该多2个,

\(F[i][j][k]\)表示位数为i,余数为j,包含13状态为k的方案数

其中k(0,1,2),2表示已经包含13,1表示上一个为1,否则为0

记忆化打法

Tips:

  1. 数组k维要开到3
  2. DP数组只算一次,只需开始初始化一次
  3. 计算转移的k时的顺序

Code

#include 
#include
int n,d[15],f[15][15][3];int dfs(int p,int mo,int exi,int lim){ int &tmp=f[p][mo][exi],r=0; if(!p) return exi==2&&!mo; if(!lim&&tmp!=-1) return tmp; int mx=lim?d[p]:9; for(int i=0;i<=mx;++i){ int t=0; if(exi==2) t=2;//必须先判,否则错解 else if(exi==1&&i==3) t=2; else if(i==1) t=1; r+=dfs(p-1,(mo*10+i)%13,t,lim&&(i==mx)); } return lim?r:tmp=r;}int main(){ memset(f,-1,sizeof(f)); while(~scanf("%d",&n)){ int len=0; while(n){ d[++len]=n%10; n/=10; } printf("%d\n",dfs(len,0,0,1)); } return 0; }

转载于:https://www.cnblogs.com/void-f/p/8087694.html

你可能感兴趣的文章
linux 0.11 源码学习(七)
查看>>
函数模板的简单用法
查看>>
利用 LINQ的skip和Take 方法对List实现分页效果
查看>>
python 中的列表解析和生成表达式 - 转
查看>>
jQuery数组的遍历 function的加载
查看>>
杂记~~~MFC SOCKET
查看>>
完成评论功能
查看>>
VC 输入法注入源码
查看>>
BinaryTree I
查看>>
IE6-IE9兼容性问题列表及解决办法_补充之四:HTC (Html Components) 功能逐渐被IE抛弃...
查看>>
Verilog与C/C++的一些区别
查看>>
DIV焦点事件详解 --【focus和tabIndex】
查看>>
vim php代码规范
查看>>
最最基本的Git入门 -- 本地仓库操作
查看>>
机器学习平台跃迁,AI中台才是大势所趋
查看>>
Imperva开源域目录控制器,简化活动目录集成
查看>>
微软发布预览版SQL Server跨平台开发工具
查看>>
Uber推出数据湖集成神器DBEvents,支持MySQL、Cassandra等
查看>>
Entity Framework Core 2.0的新特性
查看>>
[deviceone开发]-do_Http组件示例
查看>>