Hdu 2089 不要62 (数位dp入门题目)
2015-10-28 16:01
369 查看
题目链接:
Hdu 2089 不要62
题目描述:
给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个?
解题思路:
以前也做过这个题目,但是空间复杂度是n。如果数据范围太大就GG了。今天看了一下数位DP,的确有时间和空间上的优越性。
用数位dp做这个题目的时候,首先要预处理出dp[x][y],代表以y开头的x位数中不含有62和4的数有多少个,在满足条件的情况下状态转移为:dp[x][y] += dp[x-1][k]。又因为对于一个数字x,如果和它位数相同的数字y小于x,那么只需要y数字其中任意一位小于x即可。然后问题就变为求ans([1, r+1]) - ans([1, l])。
Hdu 2089 不要62
题目描述:
给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个?
解题思路:
以前也做过这个题目,但是空间复杂度是n。如果数据范围太大就GG了。今天看了一下数位DP,的确有时间和空间上的优越性。
用数位dp做这个题目的时候,首先要预处理出dp[x][y],代表以y开头的x位数中不含有62和4的数有多少个,在满足条件的情况下状态转移为:dp[x][y] += dp[x-1][k]。又因为对于一个数字x,如果和它位数相同的数字y小于x,那么只需要y数字其中任意一位小于x即可。然后问题就变为求ans([1, r+1]) - ans([1, l])。
#include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 10; int dp[maxn][maxn]; //dp[x][y] 以y开头的x位数满足题意的个数 void init () { memset(dp, 0, sizeof(dp)); dp[0][0] = 1; for (int i=1; i<=7; i++)//i位数 for (int j=0; j<10; j++)//第i位数 for (int k=0; k<10; k++)//第i-1位数 { if(j==4 || j==6&&k==2) continue ; dp[i][j] += dp[i-1][k]; } } int solve (int n) { int a[maxn], len = 0, ans = 0; while (n) { a[++len] = n % 10; n /= 10; } a[len+1] = 0; for (int i=len; i>0; i--) {//枚举后len位的策略 for (int j=0; j<a[i]; j++) { if (j==4 || a[i+1]==6&&j==2) continue ; ans += dp[i][j]; } if (a[i]==4 || a[i+1]==6 && a[i]==2) break; } return ans; } int main () { int n, m; init (); while (scanf ("%d %d", &n, &m), n + m) printf ("%d\n", solve(m+1) - solve(n)); return 0; }
相关文章推荐
- <iOS>一个开发中值得注意的细节
- 【华为交换路由常用命令】 chore.仅作为个人分享
- UE3 iPhonePackager 工具
- Web项目中加载Spring配置的常用方法
- xcode在真机调试的时候出现"The identity used to sign the executable is no longer valid"
- python - web框架 - flask 代码中含有中文内容解决办法
- 关于UMeng分享iOS9上配置NSAppTransportSecurity导致UIWebView无法访问渣浪微博
- Xml Publisher 程序控制模板输出格式(word, pdf)
- Spring IoC实现解耦合
- LeetCode OJ:Binary Tree Postorder Traversal(后序遍历二叉树)
- 修复Nginx报错:upstream sent too big header while reading response header from upstream
- 20岁女大学生开网店年赚100万,自曝曾shua销量
- Algorithms—295.Find Median from Data Stream
- Android屏幕适配经验谈
- UE3游戏性分析器
- 腾讯大讲堂:发10亿个红包,微信为啥没崩溃?
- Android把res/raw的资源转化为Uri形式访问(android.resource://)
- Java中的final用法及含义
- 贯穿产品运营过程的三个用户思维
- 软件测试的目的、原则和结束标志