### HDU 6148 题目链接 ###

题目大意:

众所周知,度度熊非常喜欢数字。

它最近发明了一种新的数字:Valley Number,像山谷一样的数字。

当一个数字,从左到右依次看过去数字没有出现先递增接着递减的“山峰”现象,就被称作 Valley Number。它可以递增,也可以递减,还可以先递减再递增。在递增或递减的过程中可以出现相等的情况。

比如,1,10,12,212,32122都是 Valley Number。

121,12331,21212则不是。

度度熊想知道不大于N的Valley Number数有多少。

注意,前导0是不合法的。

分析:

1、数位DP,很容易知道第一维表示的是 数位 ,第二维表示的是前一个数,而由于要记录斜率(即递增递减),所以要加入第三维,表示在当前数位之前,是递增还是递减或是没有(当且仅当有两个不同数时,才会有递增或递减)

2、前导零需要加入 lead 标记,然后根据样例,这题好像数字 0 也被认定为了前导零,故不需要加以判断为 0 的情况。

3、然后根据题意,如果该数位之前满足递增且当前数严格小于上一个数时,才 continue。

4、注意 lead==true 时,也是没有递增递减的,因为直到第一个非 0 数才开始计算。即当如果 lead==true 而此时数位上不为 0 时,则说明枚举的数字从该位开始,故可以与 pre==-1 合并在一起 (即一开始没有数字时,此时pre==-1 且 lead 也为 true)

代码如下:

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const ll mod = (ll) ;
char s[];
int t,n;
int a[];
ll dp[][][];
ll dfs(int pos,int pre,int k,bool lead,bool limit){ // 第 pos 位,前一个数为 pre,之前的数斜率为 k (k==0 未知,即只有一个数时;k==1,pre与之前的数递增;k==2,pre与之前的数递减), lead 前导零标记,limit 位数限制标记
if(pos==) return lead?:;
if(!limit&&dp[pos][pre][k]!=-) return dp[pos][pre][k]; //记忆化搜索
int up=limit?a[pos]:;
ll res=;
for(int i=;i<=up;i++){
if(k==&&i<pre) continue;
if(lead==true&&i==) res=(res+dfs(pos-,i,k,true,limit&&i==a[pos])%mod+mod)%mod;
else if(lead) res=(res+dfs(pos-,i,k,false,limit&&i==a[pos])%mod+mod)%mod;
else if(i==pre) res=(res+dfs(pos-,i,k,false,limit&&i==a[pos])%mod+mod)%mod;
else res=(res+dfs(pos-,i,(i<pre?:),false,limit&&i==a[pos])%mod+mod)%mod;
}
if(!limit) dp[pos][pre][k]=res;//记忆化
return res;
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
memset(dp,-,sizeof(dp));
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
int len=strlen(s);
for(int i=;i<len;i++) a[len-i]=s[i]-'';
printf("%lld\n",dfs(len,-,,true,true) );
}
}

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

  1. hdu 4507 数位dp(求和,求平方和)

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...

  2. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6156 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6156 题意:如题. 解法:数位DP,暴力枚举进制之后,就转化成了求L,R区间的回文数的个数,这个直接做 ...

  4. hdu:2089 ( 数位dp入门+模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...

  5. HDU 4352 XHXJ's LIS HDU(数位DP)

    HDU 4352 XHXJ's LIS HDU 题目大意 给你L到R区间,和一个数字K,然后让你求L到R区间之内满足最长上升子序列长度为K的数字有多少个 solution 简洁明了的题意总是让人无从下 ...

  6. hdu 3709 数位dp

    数位dp,有了进一步的了解,模板也可以优化一下了 题意:找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数例如4139,以3为支点4*2 ...

  7. HDU 2089 数位dp入门

    开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢) 传说院赛要取消 ? ... 这么菜不出去丢人也好吧~ #include<stdi ...

  8. HDU 2089 数位dp/字符串处理 两种方法

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. HDU 5808[数位dp]

    /* 题意: 给你l和r,范围9e18,求l到r闭区间有多少个数字满足,连续的奇数的个数都为偶数,连续的偶数的个数都为奇数. 例如33433符合要求,44不符合要求.不能含有前导零. 思路: 队友说是 ...

  10. HDU 3652(数位DP)

    题目链接:B-number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

随机推荐

  1. 2019 年 GitHub 上最热门的 Java 开源项目

    1.JavaGuide https://github.com/Snailclimb/JavaGuide Star 22668 [Java 学习 + 面试指南] 一份涵盖大部分 Java 程序员所需要掌 ...

  2. Flink JobManager 和 TaskManager 原理

    转自:https://www.cnblogs.com/nicekk/p/11561836.html 一.概述 Flink 整个系统主要由两个组件组成,分别为 JobManager 和 TaskMana ...

  3. pyEcharts安装及使用指南(最新)

    pyEcharts安装及使用指南(最新): 网上资料大多数是0.5X的版本, 这里我给出我的0.5版本连接https://www.cnblogs.com/dgwblog/p/11811562.html ...

  4. 层级轮播图(animate)

    层级轮播图(animate) css <style type="text/css"> * { margin: 0; padding: 0; } ul, ol { lis ...

  5. 使用ScriptX控件实现IE浏览器分页打印功能

    之前讲过js调用ie浏览器自带打印的用法,今天讲使用插件的方式.浏览器自带打印不能控制页边距.页眉页脚等选项,尤其是如果分页打印的话,无法自动将前一页标题带到本页,所以不适用多页打印的功能.使用Scr ...

  6. 10、Fiddler中设置断点修改Response

    当然Fiddler中也能修改Response 第一种:打开Fiddler 点击Rules-> Automatic Breakpoint  ->After Response  (这种方法会中 ...

  7. 计算机组成原理——cache高速缓存存储器

    转载自https://blog.csdn.net/chen1083376511/article/details/8187481 cache-高速缓存存储器 在主存与CPU之间插入一级或多级SRAM组成 ...

  8. 数据库——SQL-SERVER练习(6) 数据库安全性

    一.实验准备 (1)运行SQL-SERVER服务管理器, 启动服务(2)运行查询分析器,  以DBA身份登录数据库服务器:      用户名sa,  密码123456(3)打开CREATE-TABLE ...

  9. 配置文件_自定义section标签获取数据

    前言:为了节约时间,先只粘贴关键代码: 1-添加section标签,name为自定义标签名称,type为:命名空间+类型,程序集名称 <section name="watchModel ...

  10. C# ICloneable,shallow clone,deep clone.

    [Serializable] public class Person:ICloneable { public string Name { get; set; } public int Id { get ...