# 数位DP入坑
Hdu 2089 不要62
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std; typedef long long LL; inline int read()
{
char c=getchar();int num=;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())
num=num*+c-'';
return num;
} const int N=1e6+; int n,m;
int a[],dgt;
int f[][; int dfs(int dep,int pre,int sta,bool lim)
{
if(!dep)
return ;
if(!lim&&f[dep][sta!=-)
return f[dep][sta];
int up=lim?a[dep]:;
int ans=;
for(int i=;i<=up;++i)
{
if(i==) continue;
if(pre==&&i==) continue;
ans+=dfs(dep-,i,i==,lim&&i==a[dep]);
}
if(!lim)
f[dep][sta]=ans;
return ans;
} int solve(int x)
{
for(dgt=;x;a[++dgt]=x%,x/=);
return dfs(dgt,,,);
} int main()
{
while()
{
memset(f,-,sizeof(f));
n=read(),m=read();
if(!n&&!m)
break;
cout<<solve(m)-solve(n-)<<'\n';
}
return ;
}
Hdu 6148 Valley Numer
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std; typedef long long LL; inline int read()
{
char c=getchar();int num=;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())
num=num*+c-'';
return num;
} const int N=;
const int mod=1e9+; int T,n;
char a[N];
int f[N][][]; int dfs(int dep,int pre,int turn,bool lim,bool invalid)
{
if(dep==n+)
return invalid?:;
if(!lim&&f[dep][pre][turn]!=-)
return f[dep][pre][turn];
int up=lim?a[dep]-='':;
int ans=;
for(int i=;i<=up;++i)
{
if(turn==&&i<pre)
continue;
int p=;
if(invalid) p=;
else if(i>pre) p=;
else if(i<pre) p=;
else p=turn;
ans+=dfs(dep+,i,p,lim&&i==a[dep],invalid&&i==);
ans%=mod;
}
if(!lim)
f[dep][pre][turn]=ans;
return ans;
} int main()
{
T=read();
while(T--)
{
memset(f,-,sizeof(f));
scanf("%s",a+);
n=strlen(a+);
cout<<dfs(,,,,)<<'\n';
}
return ;
}
Bzoj 1026: [SCOI2009]windy数
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; typedef long long LL; inline LL read()
{
char c=getchar();LL num=;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())
num=num*+c-'';
return num;
} LL A,B;
LL a[],dgt;
LL f[][]; LL dfs(int dep,int pre,bool lim,bool invalid)
{
if(!dep)
return invalid?:;
if(!lim&&!invalid&&f[dep][pre]!=-)
return f[dep][pre];
int up=lim?a[dep]:;
LL ans=;
for(int i=;i<=up;++i)
{
if(!invalid&&abs(i-pre)<) continue;
ans+=dfs(dep-,i,lim&&i==a[dep],invalid&&i==);
}
if(!lim&&!invalid)
f[dep][pre]=ans;
return ans;
} LL solve(LL x)
{
for(dgt=;x;a[++dgt]=x%,x/=);
return dfs(dgt,,,);
} int main()
{
A=read(),B=read();
memset(f,-,sizeof(f));
cout<<solve(B)-solve(A-);
return ;
}
Poj 3252 Round Numbers
题意:问[l,r]中二进制位1比0少的数有多少个。
Sol: 记录当前层0,1个数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; typedef long long LL; inline int read()
{
char c=getchar();int num=;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())
num=num*+c-'';
return num;
} int l,r;
int a[],bit;
int f[][][]; int dfs(int dep,int c0,int c1,bool lim,bool invalid)
{
if(!dep)
return (!invalid&&c0>=c1)?:;
if(!lim&&f[dep][c0][c1]!=-)
return f[dep][c0][c1];
int up=lim?a[dep]:;
int ans=;
for(int i=;i<=up;++i)
ans+=dfs(dep-,c0+(i==&&!invalid),c1+(i==),lim&&i==up,invalid&&i==);
if(!lim)
f[dep][c0][c1]=ans;
return ans;
} int solve(int x)
{
for(bit=;x;a[++bit]=x&,x>>=);
return dfs(bit,,,,);
} int main()
{
memset(f,-,sizeof(f));
l=read(),r=read();
cout<<solve(r)-solve(l-);
return ;
}
P2518 [HAOI2010]计数
一个比较假的数位DP?但也是按照数位来做的。
Sol:无。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; typedef long long LL; inline int read()
{
char c=getchar();int num=;
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())
num=num*+c-'';
return num;
} char num[];
LL ans;int n,m;
int a[],cnt[]; LL c[][];
void init()
{
c[][]=;
for(int i=;i<=;++i)
{
c[i][]=;
for(int j=;j<=i;++j)
c[i][j]=c[i-][j-]+c[i-][j];
}
} LL C(int n)
{
LL res=;
for(int i=;i<;++i)
if(cnt[i])
res*=c[n][cnt[i]],n-=cnt[i];
return res;
} int main()
{
init();
scanf("%s",num+);
for(n=;num[n];++n)
a[n]=num[n]-'',++cnt[num[n]-''];
m=--n;
for(int i=;i<=n;++i)
{
--m;
for(int j=;j<a[i];++j)
if(cnt[j])
--cnt[j],ans+=C(m),++cnt[j];
--cnt[a[i]];
}
cout<<ans;
return ;
}
# 数位DP入坑的更多相关文章
- 【距离GDOI:141天】 滚入数位DP的坑
作为博客园的第一篇...我都不知道要写什么了 ... 其实今天很没状态,就当吐槽吧... 嗯,被黄神带去写treap+可持久化线段树,然后在可持久化的删除上面跪了两天,真的是一跪不起.我已经连续多久没 ...
- 数位dp踩坑
前言 数位DP是什么?以前总觉得这个概念很高大上,最近闲的没事,学了一下发现确实挺神奇的. 从一道简单题说起 hdu 2089 "不要62" 一个数字,如果包含'4'或者'62', ...
- 开坑数位dp
[背景] 在10月3日的dp专练中,压轴的第6题是一道数位dp,于是各种懵逼. 为了填上这个留存已久的坑,蒟蒻chty只能开坑数位dp了. [例题一][HDU2089]不要62 题目大意:给你一个区间 ...
- 浅谈数位DP
在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...
- 51NOD 1623 完美消除 数位DP
题目描述: 定义数的消除操作为选定[L,R,x],如果数的第L到第R位上的数字都大于等于x,并且这些数都相等,那么该操作是合法的(从低位到高位编号,个位是第一位,百位是第二位……),然后将这些位数上的 ...
- 数位dp——统计'1'的个数
今天去牛客网看了看 包含一 这道题,一开始没看清,以为它要统计 1~n 所有数中数字 '1' 出现的总次数,也就是说,若 n == 11,则 ans = 4:而按照题目的原意 ans 应该为 3.看错 ...
- CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)
问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...
- 数位DP专题
这周开始刷数位DP,在网上找到一份神级数位DP模板,做起题目来爽歪歪. http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html in ...
- 【HDU3530】 [Sdoi2014]数数 (AC自动机+数位DP)
3530: [Sdoi2014]数数 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 682 Solved: 364 Description 我们称一 ...
随机推荐
- linux 三剑客(awk,sed,grep)
1.awk 在某些场景下,我们需要过滤方式希望是列来匹配,而不是sed的行来匹配,而且awk还可以嵌套for等循环去使用,拓展性强,当然awk也是最难的. awk的常用命令选项: -F fs fs ...
- SQL -------- TOP 查询前几行
SELECT TOP 子句用于指定要返回的记录数量.并不是所有的数据库系统都支持SELECT TOP子句.MySQL支持LIMIT子句来选择有限数量的记录,而Oracle使用ROWNUM. top 后 ...
- 通过四个问题了解HTTP协议基础
很多人都知道学习和理解HTTP协议的重要性及必要性,但HTTP相关知识对计算机基础较差,尤其是我这种没有计算机基础的人来说更是晦涩难懂 乘着最近有空闲时间,开始恶补HTTP相关基础知识,下面请跟着我通 ...
- java 解决safari下载中文文件名乱码
主要就是在响应头设置content-disposition,主要遵循 RFC 5987标准. response.setHeader("content-disposition",&q ...
- javascript时间戳与日期格式的相互转换
这里总结下JavaScript中时间戳和日期格式的相互转换方法(自定义函数). 将时间戳转换为日期格式 function timestampToTime(timestamp) { var date = ...
- 初次用R的实际案例数据分析
这是一次教授布置的期末作业,也是书籍<商务数据分析与应用>的一个课后作业 目录 数据描述 数据预处理 描述性统计分析 模型分析(方差分析) 数据描述 非学位职业培训机构的178个学员的数据 ...
- 【题解】C2Crni - Crni [COCI2010] [SP7884]
[题解]C2Crni - Crni [COCI2010] [SP7884] 传送门:\(\text{C2Crni - Crni}\) \(\text{[COCI2010]}\) \(\text{[SP ...
- 使用kibana给不同的用户创建不同的space
Elastic安全机制 在很多的情况下,出于安全的原因,我们需要对不同的Kibana用户分配不同的用户权限,这样使得他们之间不能互相访问彼此的资源,同 时他们也应该对不同的索引拥有不同的权限,比如读, ...
- C# while循环
一.简介 只要给定条件为true,C#的while循环语句会循环重新执行一个目标的语句. 二.语法 C# while的语法: while(循环条件) { 循环体: } 三.执行过程 程序运行到whil ...
- asp.net chart美化+绑定数据--饼图
asp.net chart之饼图 开发环境VS2010 chart控件是vs自带控件 前台: <asp:Chart ID="Chart3" runat="serve ...