HDU6148-Valley Numer【数位dp】
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6148
Valley Numer
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1157 Accepted Submission(s): 595
Problem Description
众所周知,度度熊非常喜欢数字。
它最近发明了一种新的数字:Valley Number,像山谷一样的数字。
当一个数字,从左到右依次看过去数字没有出现先递增接着递减的“山峰”现象,就被称作 Valley Number。它可以递增,也可以递减,还可以先递减再递增。在递增或递减的过程中可以出现相等的情况。
比如,1,10,12,212,32122都是 Valley Number。
121,12331,21212则不是。
度度熊想知道不大于N的Valley Number数有多少。
注意,前导0是不合法的。
Input
第一行为T,表示输入数据组数。
每组数据包含一个数N。
● 1≤T≤200
● 1≤length(N)≤100
Output
对每组数据输出不大于N的Valley Number个数,结果对 1 000 000 007 取模。
Sample Input
3 3 14 120
Sample Output
3 14 119
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;ll a[111],dp[111][10][3];
char s[111];ll dfs(ll pos,ll pre,ll status,bool limit,bool lead)
{if(pos==-1){return lead?0:1;}if(!limit&&!lead&&dp[pos][pre][status]!=-1){return dp[pos][pre][status];}ll res=0;ll up=limit?a[pos]:9;for(ll i=0;i<=up;i++){if(status&&i<pre)continue;ll nxt=0;if(!lead&&(i>pre)||status)nxt=1;ll nxtlead=0;if(i==0&&lead)nxtlead=1;ll nxtlimit=0;if(limit&&i==a[pos])nxtlimit=1;res=(res+dfs(pos-1,i,nxt,nxtlimit,nxtlead))%mod;}if(!limit&&!lead)dp[pos][pre][status]=res;return res;
}int main()
{ll t;scanf("%lld",&t);while(t--){memset(dp,-1,sizeof(dp));scanf("%s",s);ll l=strlen(s);for(ll i=0;i<l;i++){a[i]=s[l-i-1]-'0';}printf("%lld\n",dfs(l-1,0,0,true,true));}return 0;
}
看到几个写数位dp很棒的博客:https://blog.csdn.net/brazy/article/details/77427699
https://www.cnblogs.com/agenthtb/p/7392518.html
HDU6148-Valley Numer【数位dp】相关推荐
- 题解HDU6148 Valley Numer(数位DP+深搜DFS)
题解HDU6148 Valley Numer[数位DP+深搜DFS] 题目 解析 参考源码 题目 Description: 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Nu ...
- HDU 6148 Valley Numer(数位DP)
Valley Numer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- HDU 6148 Valley Numer [数位dp]
题意:求出小于等于n的,满足三种情况的任意一种的数的个数: ①每个位数字,递增,如122 ②每个位数字,递减,如211 ③每个位数字,先递减,在递增,如121 题解:数位dp,记录三维,pos(枚举的 ...
- HDU6148 Valley Numer
HDU6148 Valley Numer 题目链接 题目大意: 思路 一道很明显的数位dp,不能出现先增后减这种情况,并且前导0是不合法,所以都需要额外的标志记录状态 代码 #include < ...
- [hdu6148][Valley Numer]
hdu6148 思路 一个数位dp模板题,注意判断前导0.用一个bz来记录当前是应该增还是可增可减.然后排除不满足条件的情况并进行dp即可. 代码 #include<cstdio> #in ...
- HDU-6148 Valley Numer(数位DP)
题意 如果对于一个 nnn 位数 a" role="presentation" style="position: relative;">aaa ...
- 2017 百度之星 复赛 Valley Numer(数位dp)
Valley Numer 数位dp,state标志前面若干位是否存在递增序列. 代码: #include <bits/stdc++.h> using namespace std;typed ...
- 2017百度之星复赛:1006. Valley Numer(数位DP)
Valley Numer Accepts: 548 Submissions: 1125 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- HDU 6148 Valley Numer (数位dp)
题意: 求区间内满足非波峰数的个数. 其中波峰 是 先上升 在 下降, 平滑不会影响前面的状态. 思路: 很明显数位dp 令dp[i][j][k] 表示 枚举到数的第i 位, 前一个数字是j ...
- HDU 6148 - Valley Numer(数位DP)
Valley Numer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
最新文章
- jquery 使用小技巧
- 每天学一点儿shell:猜数字游戏
- 软件工程概论 课堂练习【图书馆系统的用例图】
- Oracle:关于分布式数据库(创建数据库链路,创建触发器)
- 逆波兰表达式简单介绍
- 【渝粤题库】陕西师范大学292241金融市场学Ⅰ 作业(高起专)
- java web 来源页_Java:Java Web--分页效果
- 用计算机参加关于动漫的工作计划,动漫社团年度工作计划
- C++ string 成员函数 length() size() 和 C strlen() 的区别
- Oracle下Latch详细介绍
- java课程 教 学小结_Java私塾中级课程学习感受和小结3
- 正确使用计算机键盘的方法是,电脑键盘指法练习的方法
- 【成电860考研】专业课考前划重点-学长课程音频转文字-用科大讯飞花钱买的-三万五千字
- 《维C中国》乡村助农暖人心第三站嘉宝果农场
- JavaBase 求 个位,十位,百位,千位
- 张朝阳开课手推E=mc²,李永乐现场狂做笔记!CEO当太久都忘了他是MIT物理博士
- 计算机病毒计算机软件系统故障,简要区分计算机病毒与软硬件故障问题
- 合成大西瓜游戏|微信合成大西瓜游戏技巧及资源
- ArrayBuffer DataView
- 软件设计师知识体系归纳总结
热门文章
- python版钉钉回调
- CSS -- CSS字体样式、文本样式、去掉列表的小圆点、背景、背景渐变
- 怎么在电脑上进行音频以及视频的素材合并
- Steam 网络联机配置代码
- 用word字体转换来代替手写作业--最详细
- 进销存ERP系统、销售单、采购单、退货单、库存管理、库存盘点、调拨、借入、借出、出库、入库、归还单、收款单、付款单、资金流水、销售报表、采购报表、库存报表、财务报表、商品库、电商erp、连锁erp
- 困难时拉你一把的图片_人,最不能忘记的,是在你困难时拉你一把的人,句句现实经典...
- Python获取抖音视频链接
- 间歇性禁食 肠道菌群 心血管代谢疾病
- 【GNN报告】北邮石川组