HDU 3555 Bomb(数位dp&记忆化搜索)
2016-02-14 22:01
453 查看
题目链接:[kuangbin带你飞]专题十五 数位DP D - Bomb
dfs(len, pre, flag)
len表示当前位数
pre==0 不含49且上一位不为4
pre==1 不含49且上一位为4
pre==2 含49
flag表示是否可以任意取值(判断范围)。
即可。
题意
求1~n的范围里含有49的数字的个数。思路
记忆化搜索dfs(len, pre, flag)
len表示当前位数
pre==0 不含49且上一位不为4
pre==1 不含49且上一位为4
pre==2 含49
flag表示是否可以任意取值(判断范围)。
即可。
代码
[code]#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cstdlib> #include <vector> using namespace std; #define LL long long LL dp[20][3]; int dis[20]; LL dfs(int len, int pre, bool flag) { if(len < 0) return pre==2; if(!flag && dp[len][pre]!=-1) return dp[len][pre]; int end = flag?dis[len]:9; LL ans = 0; for(int i=0; i<=end; i++) { if(pre==2 || pre==1 && i==9) ans += dfs(len-1, 2, flag&&i==end); else if(i==4) ans += dfs(len-1, 1, flag&&i==end); else ans += dfs(len-1, 0, flag&&i==end); } if(!flag) dp[len][pre] = ans; return ans; } LL solve(LL n) { int len = 0; while(n) { dis[len++] = n%10; n /= 10; } return dfs(len-1, 0, 1); } int main() { int T; cin>>T; memset(dp, -1, sizeof(dp)); while(T--) { LL n; cin>>n; cout<<solve(n)<<endl; } return 0; }
相关文章推荐
- Spring+Quartz(定时任务)
- NSString,NSData,NSFileManager常用方法
- 018 virtualbox上安装Mac OS Mavericks
- 月亮之眼
- File类
- 拓扑编号
- 1048. Find Coins (25)
- JVM如何判断对象是否需要被回收
- hdu 1201 18岁生日
- 敢想,是一切可能的开始。
- 从vmware技术团队跳槽到微软技术团队(comlan)
- sethc后门
- 敢想,是一切可能的开始。
- 敢想,是一切可能的开始。
- 敢想,是一切可能的开始。
- Linux学习分享:月薪3K到13K的距离有多远?
- NSURLSession
- J2SE五个常用类
- c++下基于windows socket的多线程服务器(基于TCP协议)
- Linux中df命令:用来检查linux服务器的文件系统的磁盘空间占用情况