百度之星复赛--Valley Numer----数位dp
来源:互联网 发布:淘宝的全球购是真货吗 编辑:程序博客网 时间:2024/05/16 09:42
Valley Numer
Accepts: 548
Submissions: 1125
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=777&pid=1005
题目很容易就能看出来这个一个数位dp,比较麻烦,但是还好,难度一般。
经典的数位DP,可以将状态设计成四维,这里我用的三维。
当前数字长度len ,最后一位数字digit,是否已经在递增序列里increased 是否和当前前缀相同same_prefix
转移时处理好这些状态就好了。
代码:
#include <cstdio>#include <cstring>#include <iostream>#define LL long longusing namespace std;const LL mod=1e9+7;char s[200];int d[200],len;LL dp[200][20][20];LL dfs(int pos,bool flag,bool first,int now,int pre){ if(pos==-1) return 1; if(!flag&&!first&&~dp[pos][now][pre]){ return dp[pos][now][pre]; } LL ans=0; int limit=flag?d[pos]:9; for(int i=0;i<=limit;i++){ if(i==0&&first){ ans+=dfs(pos-1,flag&&i==limit,first,now,pre); ans%=mod; } else{ if(now>pre){ if(i<now) continue; } if(now==i) ans+=dfs(pos-1,flag&&i==limit,first&&i==0,i,pre); else ans+=dfs(pos-1,flag&&i==limit,first&&i==0,i,now); ans%=mod; } } if(!flag&&!first) dp[pos][now][pre]=ans; return ans;}int main(){ int t; scanf("%d",&t); memset(dp,-1,sizeof(dp)); while(t--){ scanf("%s",s); len=strlen(s); for(int i=0;i<len;i++){ d[i]=s[i]-'0'; } for(int i=0;i<len/2;i++){ swap(d[i],d[len-1-i]); } LL ans=dfs(len-1,1,1,10,10)-1; ans=(ans%mod+mod)%mod; cout<<ans<<endl; }}
阅读全文
0 0
- 百度之星复赛--Valley Numer----数位dp
- 2017 百度之星 复赛 Valley Numer(数位dp)
- 2017百度之星复赛:1006. Valley Numer(数位DP)
- HDU 6148 && 2017 百度之星复赛 1005 Valley Numer(数位dp)
- 2017百度之星复赛 hdu 6148 Valley Numer (数位dp)
- 百度之星复赛Valley Numer II
- 百度之星Valley Numer
- hdu6148-Valley Numer(数位dp)
- HDU-2017"百度之星"程序设计大赛-复赛-1005-Valley Numer
- HDU-2017"百度之星"程序设计大赛-复赛-1006-Valley Numer II
- hdu 6148 Valley Numer 数位dp
- HDU 6148 Valley Numer [数位dp]
- hdu 6148 Valley Numer(数位DP)
- Hdu 6148 Valley Numer 数位DP
- hdu 6148 Valley Numer (数位dp)
- hdu 6148 Valley Numer (数位dp)
- HDU 6148 Valley Numer (数位dp)
- HDU6148 Valley Numer (2017百度之星程序设计大赛
- 过山车||HDU2063
- 行列式的计算
- java实现二叉树的创建以及遍历
- hdu 2090 算菜价(水到不能再水!)
- 数位dp模板
- 百度之星复赛--Valley Numer----数位dp
- 前端常用知识
- 2017最新PHP初级经典面试题目汇总(下篇)
- linux 基础 —— 网络管理
- spark学习-SparkSQL--13-java版JavaRDD与JavaPairRDD的互相转换
- C++面试题之哪些函数不能声明为虚函数
- Java中Iterator和ListIterator的区别
- 例2-18 产生一个从2Hz增加到10Hz的啁啾信号(扫频余弦信号),并将其推迟500个采样周期。
- 设计模式——模板方法模式