数位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. LeetCode 209. 长度最小的子数组(Minimum Size Subarray Sum)

    题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums ...

  2. OpenJudge计算概论-成绩判断

    /*========================================================= 成绩判断 总时间限制: 1000ms 内存限制: 6000kB 描述 输入一个0 ...

  3. nodejs做中间层,转发请求

    简述node中间层的优势 node中间层,可以解决前端的跨域问题,因为服务器端的请求是不涉及跨域的,跨域是浏览器的同源策略导致的,关于跨域可以查看跨域复习使用node坐中间层,方便前后端分离,后端只需 ...

  4. ALV显示金额字段值扩大100倍

    内表数据 物料                  库位          期末庫存金額F0D7004DSA   1PYF       701410.944F0D7004DSA   1SNT      ...

  5. LeetCode_88. Merge Sorted Array

    88. Merge Sorted Array Easy Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1  ...

  6. DTCMS,添加文章时,内容中第一张图片作缩略图,并且等比例缩放图片

    DTCMS,添加文章时,内容中第一张图片作缩略图 admin/article/article_edit.aspx.cs 导入: using System.Drawing;using System.Dr ...

  7. Jupter Notebook常用快捷键与常用的魔法命令

    jupter notebook快捷键整理 Part1 1.删除Cell——双击D 2.撤销删除——Z 3.新建Cell——A/B (向上/向下) 4.命令窗口——P 5.运行——Ctrl+Enter ...

  8. vmware虚拟机网络不通原因之一

    我是在华硕笔记本上安装的vmware workstation.而且我用虚拟机的网络模式喜欢选“桥接”模式. 最近在虚拟上做实验,打开虚拟机windows 2003后,网卡配置静态ip后显示状态正常,但 ...

  9. python安装第三方的包

    转载自:http://blog.csdn.net/xyqzki/article/details/38414433 第一种基本安装方法 1 下载第三方包,解压 2 在命令提示符里输入cmd,然后用cd进 ...

  10. Memcached集群实现及原理介绍

    一.Memcached集群介绍 1.自身通过算法保证数据唯一性2.集群形式对用户和Memcached都是透明的3.Memcached的集群是通过客户端实现的4.Memcached服务端相互不认识 二. ...