BZOJ 1026 浅谈数位动态规划朝花夕拾
来源:互联网 发布:域名备案不能有打折字 编辑:程序博客网 时间:2024/06/07 02:32
世界真的很大
为什么说是朝花夕拾呢,大概是做原来做过的题吧
但是原来没有细想,只是copy了代码,觉得“嗯,有道理!”
最近大刀阔斧地研究数位DP,然后就把这道题重写了
作为对于这两天数位DP的掌握的总结,还是写点什么吧
看题先:
description:
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
input:
包含两个整数,A B。
output:
一个整数
首先这道题很显然一看就是数位DP
给出了a,b的范围,问有多少个满足条件的数,而且条件还和数位有关
首先考虑暴力的DFS,根据条件,这一位枚举什么只与上一位是什么有关,所以说dfs需要转移的状态除去pos以外,肯定还有上一位是什么,然后就是lim
f数组的定义由dfs的状态设计得到,由于是要保存后继状态的答案,即保存当前位对后继态的影响,自然是f(i,j),保存第i位,上一位为j的答案
特判首位为0的情况
完整代码:
#include<stdio.h>#include<cstring>#include<iostream>#include<algorithm>using namespace std;typedef long long dnt; int a[20],f[20][20];dnt dfs(int pos,int pre,int lim){ dnt ans=0; if(pos==-1) return 1; if(!lim && f[pos][pre]!=-1) return f[pos][pre]; int up=lim ? a[pos] : 9; for(int i=0;i<=up;i++) { int tmp=i; if(abs(pre-i)<2) continue ; if(i==0 && pre==12) tmp=pre; ans+=dfs(pos-1,tmp,lim && i==up); } if(!lim) f[pos][pre]=ans; return ans;}dnt solve(dnt n){ int cnt=0; memset(a,0,sizeof(a)); memset(f,-1,sizeof(f)); while(n) { a[cnt++]=n%10; n/=10; } return dfs(cnt-1,12,1);}int main(){ dnt a,b; cin >> a >> b; cout << solve(b)-solve(a-1) << endl; return 0;}/*EL PSY CONGROO*/
嗯,就是这样
阅读全文
0 0
- BZOJ 1026 浅谈数位动态规划朝花夕拾
- HDU 3652 浅谈数位动态规划朝花夕拾Ver2.0
- BZOJ 1026 浅谈特殊要求预处理数位动态规划
- BZOJ 1833 浅谈简单数位动态规划
- BZOJ 1799 浅谈数位动态规划再进阶
- HDU 4734 浅谈数位动态规划进阶
- HDU 3652 浅谈数位动态规划即记忆化搜索
- HDU 2089 浅谈数位动态规划水题
- HDU 3555 浅谈数位动态规划逆向计数问题练习
- BZOJ 1087 浅谈状态压缩动态规划的转移
- BZOJ 4318 浅谈期望运算性质及期望动态规划
- BZOJ 4720 浅谈期望动态规划状态转移
- BZOJ 4145 浅谈状态压缩动态规划背包问题
- BZOJ 2969 浅谈矩阵期望动态规划面积分布式转移
- BZOJ 1597 浅谈构造斜率--优化动态规划转移
- 【jzoj4630】【计数】【数位动态规划】
- 动态规划_数位DP
- UVALive 4998 浅谈欧拉定理优化数位动态规划求解高阶同余方程
- java实现定时任务 Schedule
- Java垃圾回收——优点和原理
- 新家来也
- K.O. -------- Eclipse中Maven的报错处理
- php常见的运行方式
- BZOJ 1026 浅谈数位动态规划朝花夕拾
- 进程间通信方式对比
- linux SElinux的设置
- 在时间路上
- PHP设计模式之-----适配器模式
- oracle分区
- copyOf和copyOfRange()的使用方法
- H5前端基础——布局
- Oracle 行迁移详解