hdu5787 数位dp 数位压缩
来源:互联网 发布:windows密码破解工具 编辑:程序博客网 时间:2024/06/06 22:40
分析:
大概是比较经典的数位dp,需要维护连续的
这样就来设计状态:
这里的
到这里赛场上都很容易想到,但是由于处理前到零一直debug了我
一言不合就加维度!
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#include <ctime>#include <stack>using namespace std;typedef pair<int, int> pii;typedef long long ll;typedef unsigned long long ull;vector<int> vi;#define pr(x) cout << #x << ": " << x << " " #define pl(x) cout << #x << ": " << x << endl#define xx first#define yy second#define sa(n) scanf("%d", &(n))#define rep(i, a, n) for (int i = a; i < n; i++)#define vep(c) for(decltype((c).begin() ) it = (c).begin(); it != (c).end(); it++) #define limit asdfconst int mod = int(1e9) + 7, INF = 0x3fffffff, maxn = 1e5 + 12;int T;ll dp[19][4][9876 + 7][5];int bits[25];ll l, r;int k;ll dfs(int len, int ban, bool limit, int k, int go, int zero, bool pre) { if (len == 0) return 1; if (!pre && !limit && dp[len][k - 2][ban][zero] != -1) return dp[len][k - 2][ban][zero]; int m = limit ? bits[len] : 9; ll ret = 0; bool no[10]; memset(no, 0, sizeof(no)); int t = ban; for (int i = 0; t; ++i) { no[t % 10] = true; t /= 10; } if (!pre && zero > 0) no[0] = true; for (int i = 0; i <= m; i++) { if (no[i]) continue; int nxt = ban % (int)pow(10, k - 2); nxt = nxt * 10 + i; int nxtzero = zero; if (!pre) { if (!i) nxtzero = k - 1; else nxtzero--; if (nxtzero < 0) nxtzero = 0; } ret += dfs(len - 1, nxt, limit && i == m, k, go + 1, nxtzero, pre && !i); } if (!pre && !limit) dp[len][k - 2][ban][zero] = ret; return ret;}//常规套路ll solve(ll n) { ll key = n, t = 1; while (key) { bits[t++] = key % 10; key /= 10; } ll ret = dfs(t - 1, 0, true, k, 0, 0, true); return ret;}int main(void){#ifdef LOCAL freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout);#endif memset(dp, -1, sizeof(dp)); while (~scanf("%lld%lld%d", &l, &r, &k)) { printf("%lld\n", solve(r) - solve(l - 1)); } return 0;}
0 0
- hdu5787 数位dp 数位压缩
- hdu5787 数位dp
- hdu5787 数位dp
- hdu5787 数位DP
- HDU5787 K-wolf Number(数位DP)
- [2016ACM多校] HDU5787 数位DP
- hdu5787 K-wolf Number【数位dp】
- hdu5791Two dp hdu5781ATM Mechine 概率dp hdu5787 K-wolf Number 数位dp
- hdu4352(数位dp+状态压缩)
- [UVALive]7344 数位dp+状态压缩dp
- lightoj 1158 状态压缩+数位DP
- hdu_4352_XHXJ's LIS(数位DP+状态压缩)
- hdu 4352 状态压缩+数位DP
- hdu4352(状态压缩+LIS+数位dp)
- 数位dp
- 数位DP
- 数位DP
- 数位dp
- 在码神的第二个项目体验
- Cocos Creator JavaScript 快速入门(摘自官方文档)
- 快速排序的简单应用及回调函数的初步理解
- Android SDK Manage无法下载各个版本的APIs
- 聊聊
- hdu5787 数位dp 数位压缩
- brainfack语言解析器
- Android测试工具MonkeyRunner(Demo篇)
- 二进制的位运算
- Linux ubuntu下搭建wiki/mantis
- SPOJ 7001 VLATTICE - Visible Lattice Points(莫比乌斯反演)
- 数据库学习笔记
- 10个超级有用、必须收藏的PHP代码样例
- 设计模式之工厂模式