题意:

求区间内满足非波峰数的个数。 其中波峰 是  先上升 在 下降,  平滑不会影响前面的状态。

思路:

很明显数位dp

令dp[i][j][k] 表示  枚举到数的第i 位, 前一个数字是j  , 状态为k 的数量。

其中k = 0 表示平滑状态, k = 1 表示上升状态, k = 2 表示下降状态。

因为前导0 是不合法的, 因此可以在开一个变量 lead 表示是否有前导0 ,当有前导0 ,强行把状态变成平滑 之类的状态即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;const int maxn = 107;
const int mod = 1e9 + 7;
int bit[maxn];
long long dp[maxn][12][3];long long dfs(int len, int pre, int state,bool lead, bool limit){if (len < 0) {return 1LL;}if (!limit && dp[len][pre][state] != -1 && !lead){return dp[len][pre][state];}int up = limit ? bit[len] : 9;long long ans = 0;for (int i = 0; i <= up; ++i){if (lead){ans = (ans + dfs(len-1, i, 0, i == 0, limit && i == up)) % mod;}else {if (i > pre)ans = (ans + dfs(len-1, i, 1, false, limit && i == up)) % mod;else if (i == pre){ans = (ans + dfs(len-1, i, state, false, limit && i == up)) % mod; /// 注意 平滑状态不会影响前面的状态。}else {if (state != 1)ans = (ans + dfs(len-1, i, 2, false, limit && i == up)) % mod;}}}if (!limit && !lead)dp[len][pre][state] = ans;return ans;
}char s[maxn];
long long solve(){int len = 0;int ll = strlen(s);for (int i = ll-1; i >= 0; --i){bit[len++] = s[i] - 48;}memset(dp,-1,sizeof dp);return dfs(len-1, 10, 2, true, true);}
int main(){int T;scanf("%d",&T);while(T--){scanf("%s", s);printf("%I64d\n", solve() - 1);}return 0;
}

Valley Numer

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 728    Accepted Submission(s): 373

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
Source
2017百度之星程序设计大赛 - 复赛
Recommend

Statistic | Submit | Discuss | Note

HDU 6148 Valley Numer (数位dp)相关推荐

  1. HDU 6148 Valley Numer(数位DP)

    Valley Numer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  2. HDU 6148 Valley Numer [数位dp]

    题意:求出小于等于n的,满足三种情况的任意一种的数的个数: ①每个位数字,递增,如122 ②每个位数字,递减,如211 ③每个位数字,先递减,在递增,如121 题解:数位dp,记录三维,pos(枚举的 ...

  3. 题解HDU6148 Valley Numer(数位DP+深搜DFS)

    题解HDU6148 Valley Numer[数位DP+深搜DFS] 题目 解析 参考源码 题目 Description: 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Nu ...

  4. HDU 6148 - Valley Numer(数位DP)

    Valley Numer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  5. HDU 6148 Valley Numer

    写了多天一直被打断的数位dp,终于写完了(丧) #include<bits/stdc++.h> using namespace std; typedef long long ll; con ...

  6. HDU 6148 Valley Numer (数位DP)题解

    思路: 只要把status那里写清楚就没什么难度T^T,当然还要考虑前导零! 代码: #include<cstdio> #include<cstring> #include&l ...

  7. hdu 6149 Valley Numer II(01背包套状压dp)

    题目链接:hdu 6149 Valley Numer II 题意: 给你N个点,有k个为高点,其他为低点,现在这N个点有m条边,问你最多能组成多少个两个高点一个低点,低点和两个高点都有边相连这样的状态 ...

  8. HDU 6156 Palindrome Function 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...

  9. Hdu 2089-不要62 数位dp

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others)    Me ...

最新文章

  1. 百度或者Google---SEO优化
  2. oracle触发器修改同一张表,oracle触发器中对同一张表进行更新再查询时,需加自制事务...
  3. SpringBatch 读取xml文件(StaxEventItemReader)用法(十三)
  4. python连接es_Elasticsearch --- 3. ik中文分词器, python操作es
  5. PHP 高级编程(3/5) - 使用SPL(标准PHP库)实现观察者模式
  6. cvCmp和cvCmpS
  7. Codeforces 803E--Roma and Poker (DP)
  8. vue路由添加.html,怎么使用VueRouter的addRoutes方法实现动态添加用户的权限路由
  9. 开机启动inittab详解
  10. canvas填充和描边介绍
  11. python坐标轴刻度设置为一个函数_Python坐标轴操作及设置代码实例
  12. 分享(转载)跟大家分享一下牛人常用的资源类,供大家参考、学习。
  13. 映美精相机的数据流转成MAT
  14. U盘做成系统盘后如何恢复成普通U盘?
  15. VM的三种网络连接方式
  16. ClickME 隐私策略
  17. android 点赞手型,在朋友圈,你是哪种点赞型人格?
  18. 消愁计算机数字按键,明日之后2019最新钢琴谱数字编码顺序大全:纸短情长、起风了、往后余生[多图]...
  19. ceil函数和floor函数的用法
  20. 品牌舆情总结及品牌修复,品牌舆情监测监控怎么做?

热门文章

  1. C语言实现带表头节点的链表
  2. Hive基础08、Hive引入Struct结构体
  3. css 输密码键盘,CSS实现迷你键盘
  4. Thread out-of-synch 错误
  5. HashMap-链表与红黑树转换触发条件
  6. 电脑开机后,显示屏无信号怎么处理?
  7. 视频教程-Kali Linux渗透测试全程课与脚本语言编程系列课程-渗透测试
  8. 当店办理层颁发声暗称偶然冲犯西邦己的豪情
  9. 博客园 首页 新随笔 联系 订阅 管理 如何使用电脑上的谷歌浏览器来调试安卓手机上的移动端页面...
  10. 锁定计算机小键盘,笔记本数字键盘锁了要怎么办【图文教程】