【HDU】6148 Valley Numer 数位DP
【算法】数位DP
【题意】定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数。T<=200,lenth(n)<=100
【题解】百度之星2017复赛,作为送分题出现,拿来练数位DP模板了。
位数多,读入记得用字符串。
记忆化要将有关变量全部纳入。
需要取模的时候别习惯性写"+=",特别是竞速赛,改起来很难受。
-1的变量前加~就和0一样了。
最后自己造数据测试了一下,记忆化搜索的速度简直全面碾压递推啊!(从此坚定了信仰)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#define ll long long
using namespace std;
const ll maxn=,MOD=;
ll f[maxn][][],a[maxn],n; ll dfs(ll pos,ll state,ll limit,ll pre){
if(pos==-){if(~pre)return ;else return ;}
if(!limit&&~pre&&~f[pos][state][pre])return f[pos][state][pre];
ll up=limit?a[pos]:;
ll ans=;
for(int i=;i<=up;i++){
if(pre==-&&i==)ans=(ans+dfs(pos-,state,limit&&i==up,pre))%MOD;else
if(pre==-&&i!=)ans=(ans+dfs(pos-,state,limit&&i==up,i))%MOD;else
if(state==)ans=(ans+dfs(pos-,i>pre,limit&&i==up,i))%MOD;else
if(state==&&i>=pre)ans=(ans+dfs(pos-,state,limit&&i==up,i))%MOD;//取模!!!
}
if(!limit&&~pre)f[pos][state][pre]=ans;//记忆化:当前状态和pos,state,pre三者都有关系!!!
return ans;
}
char s[maxn];
int main(){
ll T;
scanf("%lld",&T);
memset(f,-,sizeof(f));
while(T--){
scanf("%s",s+);
n=strlen(s+);
for(int i=;i<=n;i++)a[n-i]=s[i]-'';
printf("%lld\n",dfs(n-,,,-));
}
return ;
}
递推有病啊……细节一大堆,对拍调了一个又一个的错误才AC了,呜呜呜。
主要细节在逐位确定的时候:
1.如果前面递增了,后面枚举数位就不准枚举比前面小的。
2.如果前面递增又递减了,直接退出。
3.如果前面不递增且该位不大于前一位,后面才能取递减的值。
数位DP的逐位递推都是根据高位信息确定低位信息的哦!能干很多事(我选择记忆化搜索QAQ)
#include<cstdio>
#include<cstring>
const int MOD=1e9+,maxn=;
int f[maxn][maxn][],ans,n,a[maxn];
int M(int x){return x>=MOD?x-MOD:x;}
void p(int &x,int y){x=(x+y>=MOD?x+y-MOD:x+y);}
void solve(){
for(int i=;i<n;i++)for(int j=;j<=;j++)p(ans,M(f[i][j][]+f[i][j][]));
for(int j=;j<a[n];j++)p(ans,M(f[n][j][]+f[n][j][]));
bool ok=;
for(int i=n-;i>=;i--){
for(int j=;j<a[i];j++)if(ok||j>=a[i+]){
if(ok&&j<=a[i+])p(ans,M(f[i][j][]+f[i][j][]));
else p(ans,f[i][j][]);
}
if(!ok&&a[i]<a[i+])break;
if(a[i]>a[i+])ok=;
}
}
char s[maxn];
int main(){
int T;scanf("%d",&T);int N=;
for(int j=;j<=;j++)f[][j][]=;
for(int i=;i<=N;i++){
for(int j=;j<=;j++){
for(int k=;k<=;k++){
if(j>k)p(f[i][j][],f[i-][k][]);
else p(f[i][j][],f[i-][k][]);
if(j>=k)p(f[i][j][],f[i-][k][]);
}
}
}
while(T--){
scanf("%s",s+);n=strlen(s+);
for(int i=;i<=n;i++)a[i]=s[n-i+]-'';a[n+]=;
for(int i=;i<=n+;i++)if(a[i]!=){
if(i==n+)n++;
a[i]++;for(int j=i-;j>=;j--)a[j]=;
break;
}
ans=;solve();
printf("%d\n",ans);
}
return ;
}
【HDU】6148 Valley Numer 数位DP的更多相关文章
- HDU 6148 Valley Numer (数位DP)
题意:... 析:好久没写数位DP了,几乎就是不会了.... dp[i][last][s] 表示前 i 位上一位是 last,当前的状态是 s,0表示非上升,1 表示非下降,然后就很简单了,只有 0 ...
- 2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】
Valley Numer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 6148 Valley Numer (数位DP)题解
思路: 只要把status那里写清楚就没什么难度T^T,当然还要考虑前导零! 代码: #include<cstdio> #include<cstring> #include&l ...
- HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛
普通的数位DP计算回文串个数 /* HDU 6156 - Palindrome Function [ 数位DP ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛 2-36进制下回文串个数 */ ...
- hdu 5898 odd-even number 数位DP
传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...
- hdu 5106 Bits Problem(数位dp)
题目链接:hdu 5106 Bits Problem 题目大意:给定n和r,要求算出[0,r)之间全部n-onebit数的和. 解题思路:数位dp,一个ct表示个数,dp表示和,然后就剩下普通的数位d ...
- HDU 2089 - 不要62 - [数位DP][入门题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- HDU 5179 beautiful number 数位dp
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...
- [hdu 2089] 不要62 数位dp|dfs 入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[n, m]区间内不含4和62的数字个数. 这题有两种思路,直接数位dp和dfs 数位d ...
随机推荐
- lintcode-33-N皇后问题
33-N皇后问题 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击. 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案包含一个明确的n皇后放置布局,其中" ...
- lol人物模型提取(七)
9月13号我就把上了贴图的模型文件发了过去,到9月18号他们那的颜色就上好了,一个叫"3d打印旗舰店"的人加了我微信并拍了几张照片发了给我,效果图如下: 第一眼看上去我还是 ...
- 基于gulp的前端自动化开发构建新
关于gulp的使用,已经在之前写过一篇文章,但是遗留了一个问题.问题是实现文件的增量式更新,就是给html引入的js和css文件打上标记.每次更新标记更新. 上篇文章想通过开发同时实现标记的实时更新, ...
- fcntl函数详解
功能描述:根据文件描述词来操作文件的特性. 文件控制函数 fcntl -- file control头文件: #include <unistd.h> #include & ...
- Firefox火狐浏览器 修改默认搜索引擎
如图:
- centos7 nginx端口转发出现502的其中一种原因
在排查了一系列可能的原因后仍无法解决,经资料查阅可能是SELinux造成,SELinux很强大但若配置不当也会造成很多组件无法正常使用,这里直接将其关闭: //打开配置文件 vi /etc/selin ...
- 【bzoj2318】Spoj4060 game with probability Problem 概率dp
题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...
- CentOS 配置无线网络,开启wifi
背景:一台老笔记本安装CentOS7.x,最小安装模式,安装后无法开启wifi 1.先用NetworkManager包的nmcli命令检查网卡,发现无线网卡wlo1信息里有个错误plugin miss ...
- BZOJ2705:[SDOI2012]Longge的问题——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2705 Description Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在 ...
- 洛谷 P4735 最大异或和 解题报告
P4735 最大异或和 题目描述 给定一个非负整数序列\(\{a\}\),初始长度为\(N\). 有\(M\)个操作,有以下两种操作类型: A x:添加操作,表示在序列末尾添加一个数\(x\),序列的 ...