Valley Numer

dp实在是太难了,做到自闭,但是还是要坚强
这道题是一道数位dp,所谓数位dp就是在某个区间内求满足某个条件的数字的个数总数。
其实对这个题型不是很熟,就单纯讲讲这个题目吧。
对于问题我们将他分成几个层次:以3456为例
0000~2999
3000~3399
3400~3449
3450~3456
他们分别有贡献的段是
0000~2999
000~399
00~49
0~6
除了最后一个阶段外,每一段都很容易在许多比较大的数字里面重复出现,我们可以用dp记录这个状态下的结果
dp[now][per][0]dp[now][per][0]dp[now][per][0]表示当前第now位,前面一个数是per,没有开始增长的方案数
dp[now][per][1]dp[now][per][1]dp[now][per][1]表示当前第now位,前面一个数是per,开始增长了的方案数
具体见代码

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<functional>
using namespace std;
typedef long long LL;
inline long long read()
{long long kk=0,f=1;char cc=getchar();while(cc<'0'||cc>'9'){if(cc=='-')f=-1;cc=getchar();}while(cc>='0'&&cc<='9'){kk=(kk<<1)+(kk<<3)+cc-'0';cc=getchar();}return kk*f;
}
const LL mod=1e9+7;
char ss[250];
LL cun[250],dp[250][25][2];
LL dfs(int now,int pre,bool zen,bool flag,bool zero)
//当前位置 前一个数 开始增长与否 是不是可以记录状态的那一段 是不是前面都是前导0
//对于全是前导0的特殊处理
{if(now<0)return !zero;if(!flag&&!zero&&dp[now][pre][zen]!=-1)return dp[now][pre][zen];//该状态已经记录LL ans=0;int fir=cun[now];if(!flag)fir=9;//当前的段是00..00~k9999for(int i=0;i<=fir;i++)//枚举当前可能的值{if(zen&&i<pre)continue;//题干条件增长后不能下降bool nzen,nzero;//下个状态的增长情况和前导0情况if(zen||(i>pre&&!zero))nzen=1;//依旧是前导0else nzen=0;if(i==0&&zero)nzero=1;else nzero=0;ans+=dfs(now-1,i,nzen,flag&&i==cun[now],nzero)%mod;ans%=mod;}if(!flag&&!zero)dp[now][pre][zen]=(ans%mod+mod)%mod;//对于整块的情况记录return (ans%mod+mod)%mod;
}
int main()
{int T=read();memset(dp,-1,sizeof dp);while(T--){scanf("%s",ss);int len=strlen(ss);for(int i=0;i<len;i++)cun[i]=(LL)(ss[len-i-1]-'0');//倒序存储while(cun[len-1]==0)len--;//删除初始前导0printf("%lld\n",dfs(len-1,0,0,1,1));}return 0;
}

Valley Numer相关推荐

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

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

  2. 2017百度之星复赛:1006. Valley Numer(数位DP)

    Valley Numer  Accepts: 548  Submissions: 1125  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: ...

  3. HDU6148 Valley Numer

    HDU6148 Valley Numer 题目链接 题目大意: 思路 一道很明显的数位dp,不能出现先增后减这种情况,并且前导0是不合法,所以都需要额外的标志记录状态 代码 #include < ...

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

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

  5. HDU 6148 Valley Numer (数位dp)

    题意: 求区间内满足非波峰数的个数. 其中波峰 是  先上升 在 下降,  平滑不会影响前面的状态. 思路: 很明显数位dp 令dp[i][j][k] 表示  枚举到数的第i 位, 前一个数字是j   ...

  6. HDU 6148 Valley Numer(数位DP)

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

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

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

  8. hdu 6149 Valley Numer II(状压+ 枚举)

    Valley Numer II Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. 2017 百度之星 复赛 Valley Numer(数位dp)

    Valley Numer 数位dp,state标志前面若干位是否存在递增序列. 代码: #include <bits/stdc++.h> using namespace std;typed ...

最新文章

  1. shell编程:定义简单标准命令集
  2. MySQL锁阻塞分析
  3. 【bzoj4712】洪水
  4. Spring Cache 实战:兼容所有缓存中间件!
  5. 小程序开发配置接口域名提示:不在以下 request 合法域名列表中,请参考文档
  6. [中国剩余定理]【学习笔记】
  7. js获取页面传来参数的方法
  8. Python学习:day20正则表达式
  9. python和lua哪个有前途_python和lua数据类型的比较
  10. Handler机制使用时候一些问题记录
  11. java lambda_Java 8 Lambda 表达式 ( 中 )- 外部参数
  12. 使用for循环打印出大写字母的ASCII码对照表
  13. 数据结构和算法 数论 素数/质数、回文素数
  14. 计算机的安全保障机制,技术安全保障管理制度
  15. execjs安装及相关问题解决
  16. 数据仓库工作总结(觉得有点意思)
  17. linux修复笔记本电池电量,我戴尔笔记本电池损耗到百分之三十了!怎么修好啊!晕...
  18. 【虹科案例】Dimetix 激光测距传感器:筒仓内料位高度的测量
  19. 传感网与物联网的区别,这二者之间的具体区别到底是什么?
  20. P2036PERKET

热门文章

  1. 阿里巴巴给我们的启示--个人评论
  2. 使用Keras的面部表情识别
  3. 图像处理3D 人体模型
  4. 使用MultiPowerOnOffTool工具 测试拔插网线对路由器的影响
  5. 静下心来学习MVC之基本概念
  6. flash 图表(XML动态获取数据)
  7. CSS中position的relative和absolute.
  8. 找不到Vivado卸载程序的解决方案
  9. 网络号,网络标识,广播地址,有效主机范围计算
  10. surface pro4 win10下安装elementray os双系统教程