菜菜的算法之路--数位DP
来源:互联网 发布:微信公众账号 阿里云 编辑:程序博客网 时间:2024/05/17 01:44
对于数位DP,我还是一知半解的状态
貌似是用递归思想实现的
dp[pos][10][2];
dfs(int pos,int pre,int have,int limit)//pos是记录当前位数,pre是表示当前搜索到的数字位的上一位是什么,have是表示有木有, limit则是复位端0.0;
先来一道简单的:HDU4278 http://acm.hdu.edu.cn/showproblem.php?pid=4278
这道题是找1 ~ n 中所有不含3,8的数字个数
当然就不用开三维数组啦,直接dp[pos][2]就行了
代码如下:
#include <iostream>#include <stdio.h>#include <algorithm>#include <string>#include <stack>#include <queue>#include <vector>#include <map>#include <set>#define Zero(a) memset(a, 0, sizeof(a))#define Neg(a) memset(a, -1, sizeof(a))#define All(a) a.begin(), a.end()#define PB push_back#define repf(i,a,b) for(i = a;i < b; i++)const int maxn = 10;using namespace std;int dig[maxn];int dp[maxn][2];int dfs(int pos, int have, int limit){if (pos < 0) return have;if (!limit && dp[pos][have] != -1)return dp[pos][have];int last = limit ? dig[pos] : 9;int ret = 0;for (int i = 0; i <= last; i++){ret += dfs(pos - 1, i, have || (i == 3 || i == 8), limit && (i == last));}if (!limit){dp[pos][have] = ret;}return ret;}int solve(int n) {int len = 0;while (n) {dig[len++] = n % 10;n /= 10;}return dfs(len - 1, 0, 0, 1);}int main() {//freopen("data.out", "w", stdout);//freopen("data.in", "r", stdin);//cin.sync_with_stdio(false);int n;while (scanf("%d",&n)!=EOF){memset(dp, -1, sizeof(dp));if (n == 0) break;else printf("%d: %d\n", n, n - solve(n));}return 0;}*记得把DP数组初始化!
P.S 对于这道题,队里的队友说可以用9进制做。。。当时感觉没思路于是就敲了数位DP,以后再尝试吧
接下来来一道标准的数位DP
HDU3555,查找1~n中含49的数有多少个
http://acm.hdu.edu.cn/showproblem.php?pid=3555
这道题只需要改改DFS就行了
const maxn = 20;
int dig[maxn];int dp[maxn][10][2];int dfs(int pos, int pre, int have, int limit){if (pos < 0) return have;if (!limit && dp[pos][pre][have] != -1)return dp[pos][pre][have];int last = limit ? dig[pos] : 9;int ret = 0;for (int i = 0; i <= last; i++){ret += dfs(pos - 1, i, have || (pre == 4 && i == 9), limit && (i == last));}if (!limit){dp[pos][pre][have] = ret;}return ret;}int solve(int n) {int len = 0;while (n) {dig[len++] = n % 10;n /= 10;}return dfs(len - 1, 0, 0, 1);}
我记得以前在A一道含13的题的时候,好像have那一块可以有另一种写法,当时叶大大给我讲的时候我没太听明白
明天去问问。。。
晚上刚刚看的数位DP。。。明天再好好补充一下其他类型的吧 0 0
- 菜菜的算法之路--数位DP
- 菜菜的算法之路--MST并查集
- 菜菜学dp系列之1 2013.07.30
- hdu2089之数位dp
- hdu4507之数位DP
- hdu4734之数位dp
- 【dp】之 数位
- 有趣的数 算法的题解(数位DP问题)
- 【算法笔记】数位dp小结
- 菜菜日志之菜菜写文章
- 【原创】爆破与反爆破—菜菜鸟的学习之路
- 艰难的数位DP
- 简单的数位dp
- 某大牛的数位DP
- 菜菜日志之开荒
- hdu 3652之数位dp
- hdu4722之简单数位dp
- 【数位dp】[Scoi2014] bzoj3598 方伯伯的商场之旅
- 【Java学习笔记 】print、printf、println的区别
- 实验一
- 动画讲解 Eclipse 常用快捷键
- LeetCode Count and Say
- Python核心编程--追踪闭包词法的变量
- 菜菜的算法之路--数位DP
- 实验二
- HttpSession创建时机
- vijos P1752潜伏者
- 社交柔道术 - 《影响力》读书笔记(二)
- Compiling TBB programs and examples on Linux Ubuntu
- 比较
- 黑马程序员_内部类
- Bean-Query 一个把对象转换为Map的Java工具库