HDU 6148 Valley Numer
写了多天一直被打断的数位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相关推荐
- HDU 6148 Valley Numer (数位dp)
题意: 求区间内满足非波峰数的个数. 其中波峰 是 先上升 在 下降, 平滑不会影响前面的状态. 思路: 很明显数位dp 令dp[i][j][k] 表示 枚举到数的第i 位, 前一个数字是j ...
- HDU 6148 Valley Numer(数位DP)
Valley Numer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- HDU 6148 - Valley Numer(数位DP)
Valley Numer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- HDU 6148 Valley Numer (数位DP)题解
思路: 只要把status那里写清楚就没什么难度T^T,当然还要考虑前导零! 代码: #include<cstdio> #include<cstring> #include&l ...
- HDU 6148 Valley Numer [数位dp]
题意:求出小于等于n的,满足三种情况的任意一种的数的个数: ①每个位数字,递增,如122 ②每个位数字,递减,如211 ③每个位数字,先递减,在递增,如121 题解:数位dp,记录三维,pos(枚举的 ...
- hdu 6149 Valley Numer II(01背包套状压dp)
题目链接:hdu 6149 Valley Numer II 题意: 给你N个点,有k个为高点,其他为低点,现在这N个点有m条边,问你最多能组成多少个两个高点一个低点,低点和两个高点都有边相连这样的状态 ...
- hdu 6149 Valley Numer II(状压+ 枚举)
Valley Numer II Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- [压位DP]Hdu 6149——Valley Numer II
题目梗概 给定一个无向图,图中的点存在高低. 定义山谷为:一个低点连接两个相邻的高点. 求不相交的山谷的最大个数. 解题思路 一看这个高点个数<=15高点个数就马上想到压位DP. i表示前i个点 ...
- 2017百度之星复赛:1006. Valley Numer(数位DP)
Valley Numer Accepts: 548 Submissions: 1125 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
最新文章
- 智源发布:悟道 · 文汇 | 面向认知,超大规模新型预训练模型
- 注意:阿里Druid连接池监控的两个坑
- 人工智能时代,为什么很多人都看好Python的发展?
- Spring AOP 实现原理与 CGLIB 应用
- delphi json
- Java 并发基础——线程安全性
- MyBatis嵌套查询解析
- web在session设置的账户用户名显示为空_海蜘蛛路由Web认证怎么设置 海蜘蛛路由Web认证方法【介绍】...
- gstreamer之RTSP Server test-mp4正确运行代码
- WPF DataGridComboBoxColumn使用(绝对良心版)
- 2021计算机技术与软件考试报名时间,2021年上半年计算机技术与软件专业 技术资格(水平)考试报名通知...
- 基于PHP的编程类学习网站设计与实现
- a 标签 downLoad属性兼容,wav音频文件浏览器直接打开
- upload-labs攻略
- 超好用的免费PDF转换器,各种互相转换,功能齐全到你不敢相信!
- Rabbitmq Ambiguous payload parameter for public xxx
- imToken安卓版下载
- Wps文档如何转换为pdf文件
- Excel中,把数字和汉字分开的方法
- Linux管道命令(pipe)