数位dp解决的问题是指求在一段数的区间里面 满足条件的数的个数

核心为两点

http://wenku.baidu.com/link?url=tpfIYzhx_MzevpIM58UZ66pr-87MCFPKTMKFdGDi5jUqyO9ckti0mY6diSz2PZEL_ZBhd2zIbhus1mnzDiAO1B5K2Vu38YDsqjmOvYKFT6q

我自己总结下吧

第一 是dp的状态转移方程

dp[i][j] 表示的是以j开头的i位数 满足条件的个数为多少

既然是要记录满足条件的个 那么 dp[i][j]=sum(dp[i-1][0~9]) 这个不难理解

for(int i=1;i<=7;i++)
{

for
(int j=0;j<=9;j++)
{

for
(int k=0;k<=9;k++)
{

if
(j!=4&&!(j==6&&k==2)) dp[i][j]+=dp[i-1][k];
}
}
}

然后就是solve函数问题 solve(i)这个函数的作用是求出【0,i)区间满足条件的数的个数

大致的思想 是从高位开始 逐一枚举比该为数小的数 在满足的条件的情况下 统计和 每次枚举完

举完一位以后 由于是列举比n小的数 所以 每一位枚举结束后 就需要将这个位定下来 

花了不少时间入门。。继续干!

#include<cstdio>
#include<iostream>
#include<string.h>
using namespace std;
int
dp[][];
int
solve(int n)
{

int
dig[],len=;
memset(dig,,sizeof(dig));
while
(n>)
{

dig[++len]=n%;
n=n/;
}

dig[len+]=;
int
ans=;
for
(int i=len;i;i--)//这里的思想 从最高位开始枚举 枚举完一位以后 由于是列举比n小的数 所以 每一位枚举结束后 就需要将这个位定下来
{
for
(int j=;j<dig[i];j++)
{

if
(j!=&&!(dig[i+]==&&j==))//判断此时的枚举是否合法
ans+=dp[i][j];
}

if
(dig[i]==||(dig[i+]==&&dig[i]==)) break;//之前位置定好了 如果出现了不满足条件的情况 后面继续下去就没有什么意思了
}
return
ans;
}

int
main()
{

int
n,m;
while
(cin>>n>>m)
{

if
(m+n==) break;
memset(dp,,sizeof(dp));
dp[][]=;
for
(int i=;i<=;i++)
{

for
(int j=;j<=;j++)
{

for
(int k=;k<=;k++)
{

if
(j!=&&!(j==&&k==)) dp[i][j]+=dp[i-][k];
}
}
}

cout<<solve(m+)-solve(n)<<endl;// 这里要不要加1是要考虑区间的开闭情况
}
return
;
}

hdu 2089 入手数位dp问题的更多相关文章

  1. HDU 2089 简单数位dp

    1.HDU 2089  不要62    简单数位dp 2.总结:看了题解才敲出来的,还是好弱.. #include<iostream> #include<cstring> #i ...

  2. HDU5898、 HDU 2089(数位DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5898 题意:很明确,找出区间[l , r]中符合连续奇数为偶数,连续偶数为奇数的个数. 思路:dp[i ...

  3. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  4. HDU(2089),数位DP

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others ...

  5. Bomb HDU - 3555 (数位DP)

    Bomb HDU - 3555 (数位DP) The counter-terrorists found a time bomb in the dust. But this time the terro ...

  6. HDU(3555),数位DP

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others ...

  7. HDU(4734),数位DP

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4734 F(x) Time Limit: 1000/500 MS (Java/Others) ...

  8. HDU 3555 Bomb 数位dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Mem ...

  9. Hdu 4734 【数位DP】.cpp

    题意: 我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2)+...a(2)*2+a(1)*1,a(i)表示十进制数x中第i位的数字. 题目给出a,b,求出0~ ...

随机推荐

  1. web-msg-sender的https支持改造

    用的是nginx代理转发443到2120端口实现,官方说workman原生支持,没有实现(现象是 访问 htttps://域名:2120/ 超时,不知道是服务器问题还是什么) 后转为用nginx代理转 ...

  2. python文件导出exe可执行程序

    开门见山的说: 1.安装pyinstaller.(windows 用pip3 Mac 用pip)在cmd中输入:pip3 install pyinstaller 2.找到你要打包的文件的目录的上一个目 ...

  3. 目录:JAVA

    收藏: Java:类与继承

  4. SQL-W3School-函数:SQL AVG() 函数

    ylbtech-SQL-W3School-函数:SQL AVG() 函数 1.返回顶部 1. 定义和用法 AVG 函数返回数值列的平均值.NULL 值不包括在计算中. SQL AVG() 语法 SEL ...

  5. ubuntu14.04 rabbitmq重启丢失用户信息

    一.rabbitmq数据是根据当前hostname作为node节点作为数据名保存 二.添加rabbimq用户sudo rabbitmqctl add_user tlwlmy tlwlmysudo ra ...

  6. 001-poi-excel-基础、单元格使用操作

    一.概述 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI (POI ...

  7. OpenStack Magnum项目简介

    1 项目简介 Magnum是OpenStack中一个提供容器集群部署的服务. Magnum是一个Pass层的OpenStack项目. Magnum使用Heat部署一个包含Docker和Kubernet ...

  8. PYTHON指定国内PIP源

    一.LINUX: vi ~/.pip/pip.conf 输入内容: [global]index-url = http://pypi.douban.com/simple/[install]trusted ...

  9. 【Leetcode_easy】724. Find Pivot Index

    problem 724. Find Pivot Index 题意:先求出数组的总和,然后维护一个当前数组之和curSum,然后对于遍历到的位置,用总和减去当前数字,看得到的结果是否是curSum的两倍 ...

  10. iOS——使用FMDB进行数据库操作(转载)

    iOS 使用FMDB进行数据库操作 https://github.com/ccgus/fmdb [摘要]本文介绍iOS 使用FMDB进行数据库操作,并提供详细的示例代码供参考. FMDB 使用方法 A ...