hdu 2089 入手数位dp问题
数位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问题的更多相关文章
- HDU 2089 简单数位dp
1.HDU 2089 不要62 简单数位dp 2.总结:看了题解才敲出来的,还是好弱.. #include<iostream> #include<cstring> #i ...
- HDU5898、 HDU 2089(数位DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5898 题意:很明确,找出区间[l , r]中符合连续奇数为偶数,连续偶数为奇数的个数. 思路:dp[i ...
- 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
- HDU(2089),数位DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others ...
- Bomb HDU - 3555 (数位DP)
Bomb HDU - 3555 (数位DP) The counter-terrorists found a time bomb in the dust. But this time the terro ...
- HDU(3555),数位DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others ...
- HDU(4734),数位DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4734 F(x) Time Limit: 1000/500 MS (Java/Others) ...
- HDU 3555 Bomb 数位dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Mem ...
- 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~ ...
随机推荐
- JavaWeb基础知识
一.WEB基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web ...
- Matlab注释的几个方法
Matlab最简单的注释当然是 %x= %这是注释,无法运行 x= %结果为2 然而%只能注释一行,如何注释更加快捷简便地注释多行呢? %{ .这就是传说中的多行注释 .成功! %} 经常需要调试程序 ...
- [C#]加密解密 MD5、AES
/// <summary> /// MD5函数 /// </summary> /// <param name="str">原始字符串</p ...
- VMware vSphere Client中启动虚拟机提示No boot filename received/Operating System not found解决方法
昨天下载安装 .NET Framework 3.5 SP1解决了VMware vSphere Client安装问题后,今天需要远程连接服务器搭建一台虚拟机. 根据指引步骤进行下一步.下一步的操作完成后 ...
- Webservice初体验:axis调用wsdl和document解析
Neo君遇到了需要调用webservice接口的情况,然而作为一只小白对这方面了解困乏,经过摸索,完成了一个小的Demo,记录下. 一:背景 同事给了我一个webservice地址,打开后后缀是&qu ...
- Java8 新特性之Stream
1.Student package com.elk.log.myTest; public class Student implements Comparable<Student> { /* ...
- 23 Flutter官方推荐的状态管理库provider的使用
加群452892873 下载对应21可文件,运行方法,建好项目,直接替换lib目录,在往pubspec.yaml添加上一下扩展. cupertino_icons: ^ flutter_swiper: ...
- Spring走向注解驱动编程
SpringFramework的两大核心,IOC(Inversion of control)控制反转和DI(Dependency Inject)依赖注入,其推崇的理念是应用系统不应以java代码的方式 ...
- jmeter 和 postman 提交 传输类型为 "multipart/form-data" 的传送写法
Charles抓包: 请求参数Chrome抓包: jmeter写法: postman写法: 脚本的写法见 https://www.cnblogs.com/kaibindirver/p/9870900. ...
- 《CNCF × Alibaba云原生技术公开课》知识点自测(三):Kubernetes核心概念
(单选)1.Kubernetes的中文含义是___. A. 船 B.舵手 C.容器平台 D.起重机 (单选) 2.Kubectl是_____. A. 一个与Kubernetes集群进行交互.管 ...