博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu2089(数位dp模版)
阅读量:4984 次
发布时间:2019-06-12

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

src :

前导零:前导零 是一种 显示数字前面的0的一种格式,比如:000,222.340这样 的好处是 格式对齐..比如我们要求是3位数的 数字001002003..010011.这样有前导零 会更好记录和排序

 

ac代码:

#include
using namespace std;#define per(i,a,b) for(int i=a;i <= b;i++)#define max(a,b) a=max(a,b)#define min(a,b) a=min(a,b)#define sz(x) (int)x.size()typedef long long ll;ll gcd(ll a,ll b){
while(b){ll t=b;b=a%b;a=t;}return a;}const int inf=0x3f3f3f3f;const int mod=1000000007;#define siz 40005int n,m,a[10],dp[10][2];//dp[pos][sta]表示前一位sta状态下这一位及之后的数位构成的所有可能ll dfs(int pos,int pre,int sta,bool limit)//这里sta的值是0/1,用来区分pre是不是6{
//limit用来判断前一位是不是数位上界,是则本位不能取到大于a[pos]的数 if(pos==-1)return 1; if(!limit&&dp[pos][sta]!=-1)return dp[pos][sta]; int up=limit?a[pos]:9; ll ans=0; for(int i=0;i<=up;i++){ if(i==4||(pre==6&&i==2))continue; ans+=dfs(pos-1,i,i==6,limit&&i==a[pos]); } if(!limit)dp[pos][sta]=ans; return ans;}ll solve(int u){ int cnt=0; while(u){ a[cnt++]=u%10; u/=10; } return dfs(cnt-1,-1,false,true);}int main(){ memset(dp,-1,sizeof(dp)); while(scanf("%d %d",&n,&m)!=EOF&&(n||m)){ printf("%lld\n",solve(m)-solve(n-1)); } return 0;}

 

转载于:https://www.cnblogs.com/WindFreedom/p/9481176.html

你可能感兴趣的文章
laravel 配置sql日志
查看>>
基于注意力机制的群组推荐算法
查看>>
Android: 创建一个AlertDialog对话框,必须按确定或取消按钮才能关闭对话框,禁止按[返回键]或[搜索键]关闭...
查看>>
linux更改shell
查看>>
win7 64位系统 pl/sql 无法解析指定的连接标识符解决办法
查看>>
linux -- RPM 和 YUM
查看>>
给列表单元格加背景色
查看>>
knockoutjs 静动态数据、行为绑定,计算属性及Sync同步更新 Value值更新事件控制...
查看>>
关于.NET编程中各种事务的实现
查看>>
spring Boot加载bean
查看>>
学习笔记 UpdateXml() MYSQL显错注入
查看>>
51nod1455(dp)
查看>>
正则:校验名字,不严格校验手机号
查看>>
软件测试作业二 —— 对于Faults,Errors,Failures的认识的习题
查看>>
.net 给前台元素设置样式
查看>>
WPF学习:控件的模板
查看>>
小数据池 深浅拷贝 集合
查看>>
Hash_Map 原理
查看>>
mysql函数大全pdf
查看>>
Asp.net 2.0在Windows 2003 Server 上配置Microsoft Excel、Microsoft Word应用程序权限时 error: 8000401a 的解决方法!...
查看>>