写了多天一直被打断的数位dp,终于写完了(丧)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=105;
const ll mod=1000000007;
ll f[maxn][15][5],T;
ll lim[maxn];
//f[i][j][k] 代表i位前驱位j第k种状态的个数
//k==0代表不确定,k==1代表下降,k==2代表上升
string s;
ll dfs(int pos,int pre,int turn,bool limit,bool pd) {//第几位,前驱,状态,上界,判断前驱, 判断前导0 if(pos==0)    return pd?0:1; if(!limit && f[pos][pre][turn]!=-1) return f[pos][pre][turn];int up=limit?lim[pos]:9;ll ans=0;for(int i=0; i<=up; ++i) {if(turn==2 && i<pre)  continue; //上升了下降 int nturn=0;//更新现在的状态if(pd)  nturn=0; //说明前面全是0 else if(i==pre)   nturn=turn;else if(i<pre)   nturn=1;else if(i>pre)  nturn=2;ans=(ans+dfs(pos-1,i,nturn,limit&&i==lim[pos],pd&&i==0))%mod;}if(!limit) return f[pos][pre][turn]=ans%mod;else return ans%mod;
}
ll solve(string s){for(int i=0;i<s.size();++i) {lim[s.size()-i]=s[i]-'0';}memset(f,-1,sizeof(f));ll ans=0;for(int i=0; i<=lim[s.size()]; ++i){ans=(ans+dfs(s.size()-1,i,0,true&&i==lim[s.size()],true && i==0))%mod;}return ans%mod;
}
int main(){scanf("%lld",&T);while(T--){cin>>s;cout<<solve(s)<<endl;}return 0;
}

HDU 6148 Valley Numer相关推荐

  1. HDU 6148 Valley Numer (数位dp)

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

  2. HDU 6148 Valley Numer(数位DP)

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

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

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

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

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

  5. HDU 6148 Valley Numer [数位dp]

    题意:求出小于等于n的,满足三种情况的任意一种的数的个数: ①每个位数字,递增,如122 ②每个位数字,递减,如211 ③每个位数字,先递减,在递增,如121 题解:数位dp,记录三维,pos(枚举的 ...

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

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

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

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

  8. [压位DP]Hdu 6149——Valley Numer II

    题目梗概 给定一个无向图,图中的点存在高低. 定义山谷为:一个低点连接两个相邻的高点. 求不相交的山谷的最大个数. 解题思路 一看这个高点个数<=15高点个数就马上想到压位DP. i表示前i个点 ...

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

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

最新文章

  1. 智源发布:悟道 · 文汇 | 面向认知,超大规模新型预训练模型
  2. 注意:阿里Druid连接池监控的两个坑
  3. 人工智能时代,为什么很多人都看好Python的发展?
  4. Spring AOP 实现原理与 CGLIB 应用
  5. delphi json
  6. Java 并发基础——线程安全性
  7. MyBatis嵌套查询解析
  8. web在session设置的账户用户名显示为空_海蜘蛛路由Web认证怎么设置 海蜘蛛路由Web认证方法【介绍】...
  9. gstreamer之RTSP Server test-mp4正确运行代码
  10. WPF DataGridComboBoxColumn使用(绝对良心版)
  11. 2021计算机技术与软件考试报名时间,2021年上半年计算机技术与软件专业 技术资格(水平)考试报名通知...
  12. 基于PHP的编程类学习网站设计与实现
  13. a 标签 downLoad属性兼容,wav音频文件浏览器直接打开
  14. upload-labs攻略
  15. 超好用的免费PDF转换器,各种互相转换,功能齐全到你不敢相信!
  16. Rabbitmq Ambiguous payload parameter for public xxx
  17. imToken安卓版下载
  18. Wps文档如何转换为pdf文件
  19. Excel中,把数字和汉字分开的方法
  20. Linux管道命令(pipe)

热门文章

  1. The Civil War in France translation04
  2. uniapp 视频图片切换,视频高度宽度自适应
  3. LabVIEW如何减少下一代测试系统中的硬件过时6
  4. Altium Designer 19简易教程(原理图的绘制)
  5. 什么是linux系统?
  6. VRTK_Artificial Rotator(人工旋转器)脚本属性详解
  7. 关于笔记本电脑修改显示器刷新频率后,重新开机时会自动修改为上一次的频率问题
  8. 状态方程的离散化仿真
  9. Verilog实现四位加/减法器(逻辑表达式)
  10. Oracle-log file sync等待事件分析