hdu3652 B-number 数位dp
2017-09-15 19:21
357 查看
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=3652题意:
给出一个数n,求从1到n范围内的数字含有子串13且能被13整除的个数思路:
数位dp,再加一维取模的状态,我对动态规划好迷啊。。。#include <bits/stdc++.h> using namespace std; const int N = 50 + 10; int dp [13][2][2]; int dig ; int dfs(int pos, int mod, bool pre, bool status, bool limit) { if(pos < 1) return mod == 0 && status; if(! limit && dp[pos][mod][pre][status] != -1) return dp[pos][mod][pre][status]; int en = limit ? dig[pos] : 9; int ans = 0; for(int i = 0; i <= en; i++) ans += dfs(pos-1, (mod*10+i) % 13, i == 1, status || (pre == 1 && i == 3), limit && i == en); if(! limit) dp[pos][mod][pre][status] = ans; return ans; } int work(int n) { int tot = 0; while(n) dig[++tot] = n % 10, n /= 10; memset(dp, -1, sizeof dp); return dfs(tot, 0, 0, 0, 1); } int main() { int n; while(~ scanf("%d", &n)) printf("%d\n", work(n)); return 0; }
#include <bits/stdc++.h> using namespace std; const int N = 50 + 10; int dp [13][3]; int dig ; int dfs(int pos, int mod, int status, bool limit) { if(pos < 1) return mod == 0 && status == 2; if(! limit && dp[pos][mod][status] != -1) return dp[pos][mod][status]; int en = limit ? dig[pos] : 9; int ans = 0; for(int i = 0; i <= en; i++) { int t = status; if(t != 2) { if(i == 1) t = 1; else if(t == 1 && i == 3) t = 2; else t = 0; } ans += dfs(pos-1, (mod*10 + i) % 13, t, limit && i == en); } if(!limit) dp[pos][mod][status] = ans; return ans; } int work(int n) { int tot = 0; while(n) dig[++tot] = n % 10, n /= 10; memset(dp, -1, sizeof dp); return dfs(tot, 0, 0, 1); } int main() { int n; while(~ scanf("%d", &n)) printf("%d\n", work(n)); return 0; }
相关文章推荐
- hdu3652 B-number 数位dp
- HDU3652 B-number 数位DP第二题
- hdu3652 B-number(数位dp+dfs)
- 【HDU3652】B-number-数位DP
- HDU3652B-number(数位DP)
- [hdu3652]B-number(数位dp)
- hdu3652 B-number[数位dp]
- hdu3652B-number(数位dp)
- HDU3652 B-number(数位dp 深搜版本)
- HDU3652:B-number(数位DP)
- 【数位DP】 hdu3652 B-number
- hdu3652B-number (数位dp)
- [暑假集训--数位dp]hdu3652 B-number
- HDU3652:B-number(数位dp + 同余)
- hdu3652 A-B number 数位DP
- HDU3652 B-number [数位DP]
- hdu3652 B-number 数位dp
- hdu3652 B-number(数位DP)
- hdu3652 B-number(数位dp)
- [hdu3652][B-number] (数位dp)