博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初学数位DP--hdu 2089
阅读量:6544 次
发布时间:2019-06-24

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

其实是做topcoder的时候碰到不会的题,看人家说要用数位dp,所以拿http://acm.hdu.edu.cn/showproblem.php?pid=2089来学习了一下

数位dp适合在一段数的区间内找出满足某些条件的数的个数,这个时候往往不能之间遍历,肯定会超时,则一般使用数位dp来解决

数位dp的常见形式是dp[i][j],表示开头是j的i位数满足条件的有多少个,当然也有其他dp[i][j][k]等等,但i,j,k都很小,不会像直接遍历那么耗时

像这道题的话,知道了dp[i][j]表示的是啥,就能列出状态转移方程(稍微认真看就能理解的):

for(int i=1;i<=7;i++)	{		for(int j=0;j<10;j++)//枚举第i位可能出现的数		{			for(int k=0;k<10;k++)//枚举第i-1位可能出现的数			{				if(j!=4&&!(j==6&&k==2))					dp[i][j]  += dp[i-1][k];			}		}	}

 

更加具体的介绍可以参考:

以下附上ac这题的代码:

 

#include 
#include
#include
#include
using namespace std;int dp[10][10];void init(){ memset(dp,0,sizeof(dp)); dp[0][0] = 1; for(int i=1;i<=7;i++) { for(int j=0;j<10;j++)//枚举第i位可能出现的数 { for(int k=0;k<10;k++)//枚举第i-1位可能出现的数 { if(j!=4&&!(j==6&&k==2)) dp[i][j] += dp[i-1][k]; } } }}int solve(int n){ init(); int digit[10]; int len = 0; while(n>0) { digit[++len] = n%10; n/=10; } digit[len+1]=0; int ans = 0; for(int i=len;i;i--) { for(int j=0;j
>l>>r) { if(l+r==0) break; else cout<
<

 

 

转载地址:http://lgodo.baihongyu.com/

你可能感兴趣的文章
【树莓派】制作树莓派所使用的img镜像(一)
查看>>
理解网站并发量
查看>>
spring整合elasticsearch之环境搭建
查看>>
TensorFlow 架构与设计-编程模型【转】
查看>>
如何运行Struts2官网最新Demo?
查看>>
'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
查看>>
XDebug 教程
查看>>
js 去html 标签
查看>>
好久不见
查看>>
小tips:JS中的children和childNodes
查看>>
二叉树的遍历
查看>>
Oracle的FIXED_DATE参数
查看>>
PostgresSQL中的限制和级联删除
查看>>
NDK配置
查看>>
(转)@ContextConfiguration注解说明
查看>>
docker in centos error
查看>>
c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex
查看>>
[置顶] ※数据结构※→☆线性表结构(queue)☆============队列 顺序存储结构(queue sequence)(八)...
查看>>
Log4perl 的使用
查看>>
Linux 系统的单用户模式、修复模式、跨控制台登录在系统修复中的运用
查看>>