hdu 2089 入手数位dp问题
2024-09-01 15:12:33
数位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;
}
最新文章
- Multiple dex files define Lcom/google/zxing/BarcodeFormat
- Tomcat双向Https验证搭建,亲自实现与主流浏览器、Android/iOS移动客户端超安全通信
- CentOS 6.5 下安装 Kibana5
- [LeetCode]题解(python):055-Jump Game
- POJ 2080
- 笨笨-歌词伴侣V1.2(酷狗KRC转LRC,LRC歌词批量下载)
- iOS 视频开发-AVPlayer
- CentOS 6.6 yum源完全配置
- poj2431 Expedition
- C#编译器和CLI的安装
- 有史以来功能最全,使用最简单的excel导入/导出工具
- Python中使用hashlib进行加密的简单使用
- Vim手册
- 将字符串XX,SS以“,”符号进行区分并分别存储在数组中
- SQL Update
- 2D 加速图形界面开发源代码亲写 想买来学习得加qq 313244484 20万当前代码,完整400万包写完
- django学习第一天
- python之路---04 列表 元组
- Lua 中与字符串有关的函数学习
- More Effective C++ 35个改善方法