题意:。。。

析:好久没写数位DP了,几乎就是不会了。。。。

dp[i][last][s] 表示前 i 位上一位是 last,当前的状态是 s,0表示非上升,1 表示非下降,然后就很简单了,只有 0 能转成 1,1就是最后的状态。

代码如下:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <cstring>
#include <set>
#include <queue>
#include <algorithm>
#include <vector>
#include <map>
#include <cctype>
#include <cmath>
#include <stack>
#include <sstream>
#include <bitset>
#define debug() puts("++++");
#define gcd(a, b) __gcd(a, b)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define fi first
#define se second
#define pb push_back
#define sqr(x) ((x)*(x))
#define ms(a,b) memset(a, b, sizeof a)
#define freopenr freopen("in.txt", "r", stdin)
#define freopenw freopen("out.txt", "w", stdout)
using namespace std; typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const LL LNF = 1e16;
const double inf = 0x3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-8;
const int maxn = 1000 + 10;
const LL mod = 1000000007;
const int dr[] = {-1, 0, 1, 0};
const int dc[] = {0, 1, 0, -1};
const char *de[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
int n, m;
const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline bool is_in(int r, int c){
return r > 0 && r <= n && c > 0 && c <= m;
} LL dp[maxn][11][2];
char s[maxn];
int a[maxn]; LL dfs(int pos, int last, int s, bool is, bool ok){
if(!pos) return !is;
LL &ans = dp[pos][last][s];
if(!is && !ok && ans >= 0) return ans; int n = ok ? a[pos] : 9;
LL res = 0;
if(last == 10){
res += dfs(pos-1, 10, s, 1, ok && 0 == n);
for(int i = 1; i <= n; ++i)
res += dfs(pos-1, i, 0, 0, i == n && ok);
}
else if(s){
for(int i = last; i <= n; ++i)
res += dfs(pos-1, i, s, i == 0 && is, ok && i == n);
}
else{
for(int i = 0; i <= n; ++i)
if(i > last) res += dfs(pos-1, i, 1, is && i == 0, ok && i == n);
else res += dfs(pos-1, i, 0, is && i == 0, ok && i == n);
}
res %= mod;
if(!is && !ok) ans = res;
return res;
} LL solve(char *s){
int len = 0;
n = strlen(s);
for(int i = n-1; i >= 0; --i)
a[++len] = s[i] - '0';
return dfs(len, 10, 0, 1, 1);
} int main(){
ms(dp, -1);
int T; cin >> T;
while(T--){
scanf("%s", s);
printf("%I64d\n", solve(s));
}
return 0;
}

  

HDU 6148 Valley Numer (数位DP)的更多相关文章

  1. 【HDU】6148 Valley Numer 数位DP

    [算法]数位DP [题意]定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数.T<=200,lenth(n)<=100 [题解]百度之星201 ...

  2. 2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】

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

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

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

  4. HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛

    普通的数位DP计算回文串个数 /* HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛 2-36进制下回文串个数 */ ...

  5. hdu 5898 odd-even number 数位DP

    传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...

  6. hdu 5106 Bits Problem(数位dp)

    题目链接:hdu 5106 Bits Problem 题目大意:给定n和r,要求算出[0,r)之间全部n-onebit数的和. 解题思路:数位dp,一个ct表示个数,dp表示和,然后就剩下普通的数位d ...

  7. HDU 2089 - 不要62 - [数位DP][入门题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  8. HDU 5179 beautiful number 数位dp

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...

  9. [hdu 2089] 不要62 数位dp|dfs 入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[n, m]区间内不含4和62的数字个数. 这题有两种思路,直接数位dp和dfs 数位d ...

随机推荐

  1. 用CSS绘制最常见的40种形状和图形

    今天在国外的网站上看到了很多看似简单却又非常强大的纯CSS绘制的图形,里面有最简单的矩形.圆形和三角形,也有各种常见的多边形,甚至是阴阳太极和网站小图标,真的非常强大,分享给大家. Square(正方 ...

  2. CentOS 7 需要安装的常用工具,及centos安装fcitx 搜狗输入法的坑旅

    https://blog.csdn.net/tham_/article/details/41868831 Centos常用设置 1.当最大化时隐藏标题栏 或者使用tweak tool 在字体中将标题栏 ...

  3. java集合遍历删除指定元素异常分析总结

    在使用集合的过程中,我们经常会有遍历集合元素,删除指定的元素的需求,而对于这种需求我们往往使用会犯些小错误,导致程序抛异常或者与预期结果不对,本人很早之前就遇到过这个坑,当时没注意总结,结果前段时间又 ...

  4. php curl处理异常逻辑

    <?php // 处理异常逻辑 if (!curl_errno($ch)) {     if (200 == curl_getinfo($ch, CURLINFO_HTTP_CODE)) {   ...

  5. centos7.3查看时区

    [root@iZ2ze3gf6h0zndx5dxyhqiZ ~]# date -R Fri, Apr :: + 即可查看时区 我们国家的东八区(+0800) 查看clock系统配置文件 [root@i ...

  6. html——网页高度

    确定浏览器窗口的尺寸(浏览器的视口,不包括工具栏和滚动条) var w=window.innerWidth || document.documentElement.clientWidth || doc ...

  7. SDN openflow 学习小得

    一.openflow 大概的工作原理 SDN 的一个大概简陋图, 同网段通讯 1.我们传统网络 pc1 10.1.1.1 要找同一子网的 pc2 10.1.1.2  通过广播洪泛.找到pc2,然后转发 ...

  8. Selinux相关

    SELinux相关的工具 /usr/bin/setenforce 修改SELinux的实时运行模式 setenforce 1 设置SELinux 成为enforcing模式 setenforce 0 ...

  9. ios常用空间UIScrollViewIndicator的一些属性

    UIScrollView属性: 1  alwaysBounceHorizontal         BOOL值,当水平滚条到达终点,总是(视图)弹跳 2  alwaysBounceVertical   ...

  10. linux下in命令

    1.用法 : ln [option] source_file dist_file -f 建立时,将同档案名删除.               -i 删除前进行询问.               ln ...