【hdu6148】Valley Numer【数位dp模板题】
题意
对于每组数据给出一个整数n(length(n)<=100),找出不大于n的数字中有多少是Valley Numer。对于Valley的定义是它每一位的数字要么是递增,要么是递减,要么是先递减后递增
分析
选拔赛的时候遇到了数位dp,以前只是听说但是没学过今天就拿出来一天的时间学了一下数位DP。
我们发现单调递减变为单调递增合法,单调递增变为递减不合法,所以通过增减判断最多只有一个拐点。那么我们在dp的时候状态只要记录当前是递增还是递减就可以了。
我们用dp[p][pre][state]来进行记忆化。p代表的是位数,pre代表的是上一位的值,state代表是递减还是递增。
这个算是数位dp很板子的一个题目,但是我一开始一直wa,感觉自己考虑的很对,然后最后看题解发现自己没有考虑前导0.
我们发现,当存在前导0的时候,相当于从这里新开一个数字,那么当前是递增还是递减就不确定了,没法根据前面的0来判断,所以当存在前导0的时候步可以记忆化否则会因为dp数组的冲突而导致答案错误。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std;
typedef long long LL;
const int mod=;
const int maxn=+;
int n,a[maxn],pos,T;
char s[maxn];
LL dp[maxn][][];//0 上升 1 下降
LL dfs(int p,int pre,int state,int lead,int limit){
if(p==){
if(lead)
return ;
return ;
}
if(!limit&&dp[p][pre][state]!=-&&!lead)
return dp[p][pre][state];
int up=limit?a[p]:;
LL res=;
for(int i=up;i>=;i--){
if(state==&&i<pre)
continue;
int st;
if(i==pre)st=state;
else if(i<pre)st=;
else st=;
if(lead)st=;
res=(res+dfs(p-,i,st,lead&&i==,limit&&i==a[p]))%mod;
}
if(!limit&&!lead)
dp[p][pre][state]=res;
return res;
}
LL solve(){
pos=;
for(int i=n-;i>=;i--){
pos++;
a[pos]=s[i]-'';
}
memset(dp,-,sizeof(dp));
return dfs(pos,,,,);
}
int main(){
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%s",s);
n=strlen(s);
printf("%lld\n",solve()%mod);
}
return ;
}
【hdu6148】Valley Numer【数位dp模板题】的更多相关文章
- HDU 2089 不要62(数位dp模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...
- 【HDU】6148 Valley Numer 数位DP
[算法]数位DP [题意]定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数.T<=200,lenth(n)<=100 [题解]百度之星201 ...
- HDU 2089 不要62 数位DP模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 参考博客:https://www.cnblogs.com/HDUjackyan/p/914215 ...
- HDU 6148 Valley Numer (数位DP)
题意:... 析:好久没写数位DP了,几乎就是不会了.... dp[i][last][s] 表示前 i 位上一位是 last,当前的状态是 s,0表示非上升,1 表示非下降,然后就很简单了,只有 0 ...
- [hdu6148][Valley Numer]
hdu6148 思路 一个数位dp模板题,注意判断前导0.用一个bz来记录当前是应该增还是可增可减.然后排除不满足条件的情况并进行dp即可. 代码 #include<cstdio> #in ...
- POJ 3286 How many 0's(数位DP模板)
题目链接:http://poj.org/problem?id=3286 题目大意: 输入n,m,求[n,m]的所有数字中,0出现的总数是多少,前导零不算. 解题思路: 模板题,设dp[pos][num ...
- 数位dp模板 [dp][数位dp]
现在才想到要学数位dp,我是不是很弱 答案是肯定的 以一道自己瞎掰的题为模板 //题: //输入数字n //从0枚举到n,计算这n+1个数中含有两位数a的数的个数 //如12930含有两位数93 #i ...
- 51nod 1009 数字1的数量(数位dp模板)
给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. 数位dp的模板题 ...
- 【数位DP】题集
1.[HDOJ2089] 题意:求区间内不出现4和62的数的个数 解法:模板题 2.[HDOJ3555] 题意:求区间内不出现49的数的个数 解法:模板题 3.[HDOJ5179] 题意:对于一个十进 ...
随机推荐
- c/c++中system函数在Linux和windows下区别
windows 在windows下的system函数中命令可以不区别大小写! 功 能: 发出一个DOS命令 #include <stdlib.h> int system(char *com ...
- erlang的一些小技巧(不定期更新)
在任意节点热更新代码 rpc:call(Node,c,l,[Mod]) c和l的指的是code,library Erlang Shell隐藏的小技巧 f(). %%把所有绑定变量释放掉 f(Val). ...
- JVM内存管理之GC算法精解(复制算法与标记/整理算法)
本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...
- 【转】Jmeter测试报表相关参数说明
Jmeter测试报表相关参数说明 采用Jmeter测试工具对web系统作的负载测试,得出的响应报表,数据比较难懂,现作一具体说明. 以下是在一次具体负载测试中得出的具体数值,测试线程设置情况为:线程数 ...
- java代码---indexOf()方法
总结:indexOf(String str,int index)方法.从参数指定位置开始,如果index值超过了字符串长度,则返回-1 package com.a.b; import java.io. ...
- PAT甲级目录
树(23) 备注 1004 Counting Leaves 1020 Tree Traversals 1043 Is It a Binary Search Tree 判断BST,BST的性质 ...
- 【洛谷】P3919 【模板】可持久化线段树(主席树)
题目 传送门:QWQ 分析 主席树的模板,囤着 代码 #include <bits/stdc++.h> using namespace std; ; ], rs[N*], root[N*] ...
- 【转】Android 中处理崩溃异常并重启程序出现页面重叠的问题
原文地址:http://blog.csdn.net/jiang547860818/article/details/53641113 android开发中经常会遇到程序异常,而已常常会遇到一出现异常AP ...
- 解决 mysql 数据库 挂掉了
问题 : mysql运行几天之后就挂掉了 , 修改了mysql 的连接数也解决不了,看代码也没有什么问题,但就是感觉哪个功能一直占着mysql资源,查了一下当前的线程状态 time的单位是 秒 , 可 ...
- 你所不知道的javascript数组特性
工作中,我们经常使用js的数组,但是,下面的东西你见过吗? 1,文本下标: var a=[]; a[-1]=1; 你想过数组的下标为负数的情况吗?我们对数组的下标规定从0开始.但是上面那么写也还是可以 ...