HDU 3555 Bomb 数位dp
来源:互联网 发布:列车网络控制系统组成 编辑:程序博客网 时间:2024/06/05 19:06
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=3555
题意:
多组测试数据,每次一个
思路:
简单数位
//300+ms#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 50 + 10, INF = 0x3f3f3f3f;ll dp[N][10][2]; //dp[i][j][k]:在无限制取值范围条件下第i位后前驱为j时状态为k时的方案数int dig[N];//分离后的数字ll dfs(int pos, int pre, int status, int limit){//pos是当前处理的位置,pre是前一个处理的位上的数字,status是有没有已经出现了49这个子串,limit表示对于当前位数字的取值范围有没有限制 if(pos < 0) return status; if(! limit && dp[pos][pre][status] != -1) return dp[pos][pre][status]; int en = limit ? dig[pos] : 9; ll ans = 0; for(int i = 0; i <= en; i++) ans += dfs(pos-1, i, status || (pre == 4 && i == 9), limit && i == en); if(! limit) dp[pos][pre][status] = ans; return ans;}int main(){ int t; ll n; scanf("%d", &t); while(t--) { scanf("%lld", &n); int tot = 0; while(n) dig[tot++] = n % 10, n /= 10; memset(dp, -1, sizeof dp); ll ans = dfs(tot-1, 0, 0, 1); printf("%lld\n", ans); } return 0;}
//70ms#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 30 + 10, INF = 0x3f3f3f3f;ll dp[N][2];ll p[N];int dig[N];ll n;void table(){ p[0] = 1; for(int i = 1; i < N; i++) p[i] = p[i-1] * 10;}ll dfs(int pos, bool is4, bool limit){ if(pos < 0) return 0; if(! limit && dp[pos][is4] != -1) return dp[pos][is4]; int en = limit ? dig[pos] : 9; ll ans = 0; for(int i = 0; i <= en; i++) if(is4 && i == 9) ans += limit ? n % p[pos] + 1 : p[pos];//直接计算无需递归,效率提升很多 else ans += dfs(pos-1, i == 4, limit && i == en); if(! limit) dp[pos][is4] = ans; return ans;}int main(){ table(); int t; scanf("%d", &t); while(t--) { scanf("%lld", &n); ll m = n; int k = 0; while(m) dig[k++] = m % 10, m /= 10; memset(dp, -1, sizeof dp); ll ans = dfs(k-1, 0, 1); printf("%lld\n", ans); } return 0;}
//这个是求不含49的个数,然后用总数减去#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 30 + 10, INF = 0x3f3f3f3f;ll dp[N][2];ll p[N];int dig[N];ll n;void table(){ p[0] = 1; for(int i = 1; i < N; i++) p[i] = p[i-1] * 10;}ll dfs(int pos, bool is4, bool limit){ if(pos < 0) return 1; if(! limit && dp[pos][is4] != -1) return dp[pos][is4]; int en = limit ? dig[pos] : 9; ll ans = 0; for(int i = 0; i <= en; i++) if(is4 && i == 9) ans += 0; else ans += dfs(pos-1, i == 4, limit && i == en); if(! limit) dp[pos][is4] = ans; return ans;}int main(){ table(); int t; scanf("%d", &t); while(t--) { scanf("%lld", &n); ll m = n; int k = 0; while(m) dig[k++] = m % 10, m /= 10; memset(dp, -1, sizeof dp); ll ans = dfs(k-1, 0, 1); printf("%lld\n", n - ans + 1); } return 0;}
阅读全文
0 0
- HDU 3555 Bomb (数位DP)
- hdu 3555 - Bomb [数位dp]
- hdu 3555 Bomb【数位DP】
- HDU 3555 Bomb (数位DP)
- hdu 3555 Bomb 数位DP
- HDU 3555 Bomb (数位DP)
- hdu 3555 Bomb 数位dp
- [HDU 3555]Bomb[数位DP]
- HDU 3555 Bomb 数位DP
- hdu 3555 Bomb 数位dp
- HDU --3555--Bomb--数位DP
- hdu 3555 Bomb (数位DP)
- 【数位DP】【HDU 3555】Bomb
- hdu 3555 Bomb(数位DP)
- HDU 3555 Bomb(数位dp)
- 数位dp HDU 3555 Bomb
- HDU-3555 Bomb 数位DP
- HDU 3555 Bomb(数位DP)
- yii简单分页
- Java学习第四天
- 【python 读取mysql数据】Python如何读取MySQL数据库表数据
- java.util和java.awt的区别
- Python调用windows下DLL详解
- HDU 3555 Bomb 数位dp
- C语言外挂实现原理
- 操作系统面试须知
- 二叉树的遍历
- java8,你应该了解的新特性(Stream API篇)
- 51NOD1681 公共祖先 【dfs序+树状数组】
- 【Unity】Unity Profiler 性能分析
- 远程BIOS重装系统就选KS-1001IP
- AR流程