Valley Numer

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

题解:裸的数位DP。用f[i][j][0/1/2]表示i位,最高位为j,当前处于 递减/递增/平 状态的数的个数。然后尽情讨论吧!

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
ll f[110][12][3];
//0 减 1 增 2 未知
int v[110];
char str[110];
ll ans;
int n,tag,tmp;
void init()
{
int i,j,k;
for(i=0;i<=9;i++) f[1][i][2]=1;
for(i=2;i<=100;i++)
{
for(j=0;j<=9;j++)
{
f[i][j][2]=f[i-1][j][2];
for(k=0;k<=9;k++)
{
if(j<=k) f[i][j][1]=(f[i][j][1]+f[i-1][k][1])%mod;
if(j<k) f[i][j][1]=(f[i][j][1]+f[i-1][k][2])%mod;
if(j>=k) f[i][j][0]=(f[i][j][0]+f[i-1][k][0])%mod;
if(j>k) f[i][j][0]=(f[i][j][0]+f[i-1][k][1]+f[i-1][k][2])%mod;
}
}
}
}
void work()
{
scanf("%s",str),n=strlen(str);
int i,j;
ans=0,tag=2;
for(i=1;i<=n;i++) v[i]=str[n-i]-'0';
for(i=1;i<n;i++) for(j=1;j<=9;j++) ans=(ans+f[i][j][0]+f[i][j][1]+f[i][j][2])%mod;
for(i=n;i>=1;i--)
{
for(j=(i==n)?1:0;j<v[i];j++)
{
tmp=tag;
if(i!=n&&j>v[i+1]) tmp=1;
if(i!=n&&j<v[i+1])
{
if(tag==1) continue;
tmp=0;
}
if(tmp==2)
{
ans=(ans+f[i][j][0]+f[i][j][1]+f[i][j][2])%mod;
}
if(tmp==1)
{
if(j>=v[i+1]) ans=(ans+f[i][j][1]+f[i][j][2])%mod;
}
if(tmp==0)
{
if(j<=v[i+1]) ans=(ans+f[i][j][0]+f[i][j][1]+f[i][j][2])%mod;
if(j>v[i+1]) ans=(ans+f[i][j][1]+f[i][j][2])%mod;
}
}
if(i!=n&&v[i]>v[i+1]) tag=1;
if(i!=n&&v[i]<v[i+1])
{
if(tag==1) break;
tag=0;
}
}
if(!i) ans=(ans+1)%mod;
printf("%lld\n",ans);
}
int main()
{
int T;
init();
scanf("%d",&T);
while(T--) work();
return 0;
}//1 130

【百度之星复赛】T5 Valley Numer的更多相关文章

  1. 百度之星复赛T5&&hdu6148

    Problem Description 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Number,像山谷一样的数字. 当一个数字,从左到右依次看过去数字没有出现先递增接着递 ...

  2. 最强密码 (百度之星复赛 T5)

    题目大意: 给出一个字符串A,要求最短的字符串B,B不是A的子序列. 求最短长度 和 最短的字符串个数    |A|<=105. 题解: 1.比赛的时候没有想出来,时隔一个多月又看到了这道题,虽 ...

  3. 百度之星复赛T6&&hd6149 ——Valley Numer II

    Problem Description 众所周知,度度熊非常喜欢图. 它最近发现了图中也是可以出现 valley —— 山谷的,像下面这张图. 为了形成山谷,首先要将一个图的顶点标记为高点或者低点.标 ...

  4. 【2017百度之星程序设计大赛 - 复赛】Valley Numer

    [链接]http://acm.hdu.edu.cn/showproblem.php?pid=6148 [题意] 在这里写题意 [题解] 先把1..N里面的山峰数字个数算出来->x 然后用N减去这 ...

  5. hdu5713 K个联通块[2016百度之星复赛B题]

    dp 代码 #include<cstdio> ; ; int n,m,k,cnt[N]; ]; ][],i,j,l,a,b; int check(int x,int y) { int i; ...

  6. hdu5714 拍照[2016百度之星复赛C题]

    由于船移动的速度都一样,那么对于往一个方向的船相对距离其实是不变的,我们可以把往一个方向移动的船都视作静止,并求出在哪些观测位置可以看到,很明显对于船[x,y,z],当x+z>=y-z的时候,可 ...

  7. hdu5715 XOR 游戏 [2016百度之星复赛D题]

     比赛的时候没仔细想,赛后一想这题其实挺简单的,先求出序列的异或前缀和,然后将异或前缀和建出一颗trie树,然后我们可以二分答案,把问题变成判定性问题,判定是否存在一种方案,使得所有的分组的异或和都大 ...

  8. 百度之星复赛 1004 / hdu5715 二分dp+trie

    XOR 游戏 Problem Description   众所周知,度度熊喜欢XOR运算[(XOR百科)](http://baike.baidu.com/view/674171.htm). 今天,它发 ...

  9. 百度之星复赛Astar Round3

    拍照 树状数组(SB了).求出静止状态下,每个点能看到多少个向右开的船c1[i],多少个向左开的船c2[i]. max{c1[i] + c2[j], (满足i <= j)  }即为答案.从后往前 ...

随机推荐

  1. 51Nod 1272最大距离 (树状数组维护前缀最小值)

    题目链接 最大距离 其实主流解法应该是单调栈……我用了树状数组. #include <bits/stdc++.h> using namespace std; #define rep(i, ...

  2. java 两个int类型的数据相除并输出百分号保留两位有效数字

    java代码: public void IntA(int a , int b){ //首先判断分母不能为0 if(b!=0){ folat num = (float) a*100/b; Decimal ...

  3. Docker镜像原理和最佳实践

    https://yq.aliyun.com/articles/68477 https://yq.aliyun.com/articles/57126  DockerCon 2016 深度解读: Dock ...

  4. Objective-C的self.用法的一些总结

    最近有人问我关于什么时候用self.赋值的问题, 我总结了一下, 发出来给大家参考. 有什么问题请大家斧正. 关于什么时间用self. , 其实是和Obj-c的存取方法有关, 不过网上很多人也都这么解 ...

  5. 2017.2.21 activiti实战--第七章--Activiti与spring集成(一)配置文件

    学习资料:<Activiti实战> 第七章 Activiti与容器集成 本章讲解activiti-spring可以做的事情,如何与现有系统集成,包含bean的注入.统一事务管理等. 7.1 ...

  6. 谈论程序中的token

    -> //指针,一旦符号分开就会成以下两个意思,我们一定要注意符号 - //减号 > //大与 int a,big; if(x>big) big = x; C语言以及一些其它语言会自 ...

  7. Iowait的成因、对系统影响及对策

    什么是iowait?顾名思义,就是系统因为io导致的进程wait.再深一点讲就是:这时候系统在做io,导致没有进程在干活,cpu在执行idle进程空转,所以说iowait的产生要满足两个条件,一是进程 ...

  8. vue 父子通信过程

    1.概述 每个 Vue 实例都实现了事件接口,即: 使用 $on(eventName) 监听事件 使用 $emit(eventName, optionalPayload) 触发事件 2.示例一(未传递 ...

  9. OpenTSDB设计解读

    OpenTSDB是基于HBase存储时间序列数据的一个开源数据库,确切地说,它仅仅是一个HBase的应用而已,其对于时间序列数据的处理能够供其它系统參考和借鉴.本文会针对它在数据库的设计方面展开一些探 ...

  10. C语言的空格问题

    对于C语言中,一般的理解是对于空格,我们可以随意输入,因为空格没啥大意义,但是事实上并非如此. 1.'\'空格的问题 '\' 字符可用于一些字符进行转移,当然也包括了 newline(enter),被 ...