菜菜的算法之路--数位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
原创粉丝点击