BNUOJ 52325 Increasing or Decreasing 数位dp
传送门:BNUOJ 52325 Increasing or Decreasing
题意:求[l,r]非递增和非递减序列的个数
思路:数位dp,dp[pos][pre][status]
- pos:处理到第几位
- pre:前一位是什么
- status:是否有前导零
递增递减差不多思路,不过他们计算的过程中像5555,444 这样的重复串会多算,所以要剪掉。个数是(pos-1)*9+digit[最高位],比如一位重复子串是:1,2,3,4...9,9个,二位重复子串:11,22,33,44,...,99,9个;同理,其他类推;
不过这个题如果dp值每算完一个[l,r]就清零,会超时。那么我们这么分析,算[l1,r1],[l2,r2]这两个区间时,dp是否真的有必要清零呢,答案是否定的,记忆化搜索的过程中记录的dp值如果计算过,那么当其他值算到他时,这个值是可以用的。具体的自己想想就好了
/**************************************************************
Problem:BNUOJ 52325 Increasing or Decreasing
User: youmi
Language: C++
Result: Accepted
Time: 380 ms
Memory: 1632 KB
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <stack>
#include <set>
#include <sstream>
#include <cmath>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#define zeros(a) memset(a,0,sizeof(a))
#define ones(a) memset(a,-1,sizeof(a))
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d%d",&a,&b)
#define sc3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define sclld(a) scanf("%lld",&a)
#define pt(a) printf("%d\n",a)
#define ptlld(a) printf("%lld\n",a)
#define rep(i,from,to) for(int i=from;i<=to;i++)
#define irep(i,to,from) for(int i=to;i>=from;i--)
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
#define lson (step<<1)
#define rson (lson+1)
#define eps 1e-6
#define oo 0x3fffffff
#define TEST cout<<"*************************"<<endl
const double pi=*atan(1.0); using namespace std;
typedef long long ll;
template <class T> inline void read(T &n)
{
char c; int flag = ;
for (c = getchar(); !(c >= '' && c <= '' || c == '-'); c = getchar()); if (c == '-') flag = -, n = ; else n = c - '';
for (c = getchar(); c >= '' && c <= ''; c = getchar()) n = n * + c - ''; n *= flag;
}
ll Pow(ll base, ll n, ll mo)
{
ll res=;
while(n)
{
if(n&)
res=res*base%mo;
n>>=;
base=base*base%mo;
}
return res;
}
//*************************** int n;
const int maxn=+;
const ll mod=;
int digit[];
ll dp0[][][];
ll dp1[][][];
int tot=;
ll dfs0(int pos,int pre,int status,int limit)
{
if(pos<)
return status;
if(!limit&&dp0[pos][pre][status]!=-)
return dp0[pos][pre][status];
int ed=limit?digit[pos]:;
ll res=;
if(status==)
{
for(int i=;i<=min(pre,ed);i++)
{
if(i==)
res+=dfs0(pos-,,,limit&&(i==ed));
else
res+=dfs0(pos-,i,,limit&&(i==ed));
}
}
else
{
for(int i=;i<=min(ed,pre);i++)
res+=dfs0(pos-,i,status,limit&&(i==ed));
}
if(!limit)
dp0[pos][pre][status]=res;
return res;
}
ll dfs1(int pos,int pre,int status,int limit)
{
if(pos<)
return status;
if(!limit&&dp1[pos][pre][status]!=-)
return dp1[pos][pre][status];
int ed=limit?digit[pos]:;
ll res=;
for(int i=pre;i<=ed;i++)
res+=dfs1(pos-,i,status||i,limit&&(i==ed));
if(!limit)
dp1[pos][pre][status]=res;
return res;
}
void work(ll num)
{
tot=;
while(num)
{
digit[tot++]=num%;
num/=;
}
}
ll solve(ll num)
{
if(num==)
return ;
ll ans=(tot-)*+digit[tot-];
ll temp=;
int tt=;
while(tt<tot)
temp=temp*+digit[tot-],tt++;
if(temp>num)
ans--;
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
int T_T;
scanf("%d",&T_T);
ones(dp0);
ones(dp1);
for(int kase=;kase<=T_T;kase++)
{
ll num;
read(num);
num--;
work(num);
ll temp0=dfs0(tot-,,,);
temp0+=dfs1(tot-,,,);
temp0-=solve(num);
read(num);
work(num);
ll temp1=dfs0(tot-,,,);
temp1+=dfs1(tot-,,,);
temp1-=solve(num);
ptlld(temp1-temp0);
}
return ;
}
BNUOJ 52325 Increasing or Decreasing 数位dp的更多相关文章
- 【数位DP】bnuoj 52813 J. Deciphering Oracles
http://acm.bnu.edu.cn/v3/contest_show.php?cid=9208#problem/J [AC] #include<bits/stdc++.h> usin ...
- Problem I. Increasing or Decreasing MIPT-2016 Pre-Finals Workshop, Taiwan NTU Contest, Sunday, March 27, 2016
题面: Problem I. Increasing or DecreasingInput file: standard inputOutput file: standard outputTime li ...
- 浅谈数位DP
在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...
- 【SPOJ 1182】 SORTBIT - Sorted bit squence (数位DP)
SORTBIT - Sorted bit squence no tags Let's consider the 32 bit representation of all integers i from ...
- 【HDU 4352】 XHXJ's LIS (数位DP+状态压缩+LIS)
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4352 XHXJ's LIS 数位dp+状态压缩
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4352 XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others ...
- HDU 4352 数位dp
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu4352 XHXJ's LIS(数位DP + LIS + 状态压缩)
#define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the entire ...
随机推荐
- web基础
1.认识webapp程序? 请求方式不同:基于事件触发------基于http协议下的http请求和http响应.点击百度一下-----发送了请求:不仅会携带问题,ip地址,主机号.请求是客户 ...
- sql联合查询
联合查询效率较高.以下例子来说明联合查询的好处 t1表结构(用户名,密码) userid int username varchar(20) password ...
- Powershell 学习笔记【持续更新】
1. 判断一个对象是不是空可以用 $null来比较 2. 判断一个字符串是不是空的: [string]::IsNullOrEmpty(...) 3. 在powershell中把结果输出为一个CSV格式 ...
- APP One Link ,android and ios qrcode merge as One QRCode and one short link
Adroid and ios qrcode merge as One QRCode and one short link is publish , the web site is www.appone ...
- mysql 时间函数转换
1 NOW() //当前时间 2 SYSDATE() //当前时间 3 CURRENT_TIMESTAMP 4 以'YYYY-MM-DD HH:MM:SS'或YYYYMMDDHHMMSS格式返回当前的 ...
- 一个巧妙的实现悬浮的tableViewHeader的方法
之前因为工作需要要实现一个类似的 悬浮+视差的headerView的效果, 研究了好久没研究出来怎么做,最后用UICollectionView + CSStickyHeaderFlowLayout的方 ...
- Android终止线程的方法
线程对象属于一次性消耗品,一般线程执行完run方法之后,线程就正常结束了,线程结束之后就报废了,不能再次start,只能新建一个线程对象.但有时run方法是永远不会结束的.例如在程序中使用线程进行So ...
- android自定义activity
今天公司有个需要需要自动弹出界面,而dialog又不符合要求,所以自定义的一个activity的样式 首先在androidmainfest.xml上注册你的activity <activity ...
- iOS 从应用中跳转至系统设置页面里的多种设置页面
我们在开发app过程中很多时候会需要设置系统权限,这时就需要在应用中跳转至系统设置页面权限设置页面,以下是自己结合网上的资料总结的一些经验: 直接从应用中跳转至系统设置中这个应用的权限设置页面 NSU ...
- JSP中request getParameter和getAttribute不同(转载)
(1)request.getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据,,request.setAttribute()和getAttribute()只是在 ...