HDU 6148 Valley Numer (数位dp)
题意:
求区间内满足非波峰数的个数。 其中波峰 是 先上升 在 下降, 平滑不会影响前面的状态。
思路:
很明显数位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
它最近发明了一种新的数字:Valley Number,像山谷一样的数字。
当一个数字,从左到右依次看过去数字没有出现先递增接着递减的“山峰”现象,就被称作 Valley Number。它可以递增,也可以递减,还可以先递减再递增。在递增或递减的过程中可以出现相等的情况。
比如,1,10,12,212,32122都是 Valley Number。
121,12331,21212则不是。
度度熊想知道不大于N的Valley Number数有多少。
注意,前导0是不合法的。
每组数据包含一个数N。
● 1≤T≤200
● 1≤length(N)≤100
Statistic | Submit | Discuss | Note
HDU 6148 Valley Numer (数位dp)相关推荐
- 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(数位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,终于写完了(丧) #include<bits/stdc++.h> using namespace std; typedef long long ll; con ...
- HDU 6148 Valley Numer (数位DP)题解
思路: 只要把status那里写清楚就没什么难度T^T,当然还要考虑前导零! 代码: #include<cstdio> #include<cstring> #include&l ...
- hdu 6149 Valley Numer II(01背包套状压dp)
题目链接:hdu 6149 Valley Numer II 题意: 给你N个点,有k个为高点,其他为低点,现在这N个点有m条边,问你最多能组成多少个两个高点一个低点,低点和两个高点都有边相连这样的状态 ...
- HDU 6156 Palindrome Function 数位DP
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...
- Hdu 2089-不要62 数位dp
题目: http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others) Me ...
最新文章
- 百度或者Google---SEO优化
- oracle触发器修改同一张表,oracle触发器中对同一张表进行更新再查询时,需加自制事务...
- SpringBatch 读取xml文件(StaxEventItemReader)用法(十三)
- python连接es_Elasticsearch --- 3. ik中文分词器, python操作es
- PHP 高级编程(3/5) - 使用SPL(标准PHP库)实现观察者模式
- cvCmp和cvCmpS
- Codeforces 803E--Roma and Poker (DP)
- vue路由添加.html,怎么使用VueRouter的addRoutes方法实现动态添加用户的权限路由
- 开机启动inittab详解
- canvas填充和描边介绍
- python坐标轴刻度设置为一个函数_Python坐标轴操作及设置代码实例
- 分享(转载)跟大家分享一下牛人常用的资源类,供大家参考、学习。
- 映美精相机的数据流转成MAT
- U盘做成系统盘后如何恢复成普通U盘?
- VM的三种网络连接方式
- ClickME 隐私策略
- android 点赞手型,在朋友圈,你是哪种点赞型人格?
- 消愁计算机数字按键,明日之后2019最新钢琴谱数字编码顺序大全:纸短情长、起风了、往后余生[多图]...
- ceil函数和floor函数的用法
- 品牌舆情总结及品牌修复,品牌舆情监测监控怎么做?