timus-1507 Amount of Degrees 按位DP
http://acm.timus.ru/problem.aspx?space=1&num=1057
其实这题可以算是一个组合数的题目了,主要是将基于其他进制转化为基于2进制的算法,对于某一位不为1的话,那么取其他位的话是一定不满足题意的,所以要找到一个数的最高位大于1,将这一位以及后面的每一位都赋值为1,然后就是一个按位DP的过程了,dp[len][statu]表示长度剩余量为len,要求1的个数为statu个时,并且对后面的位没有要求的情况下,所有可能的解。
代码如下:
#include <cstring> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std;typedef unsigned int Int;Int x, y, k, b, bit[35];int len, dp[35][35];Int dfs(int pos, int statu, int limit) { if (pos == -1) {return statu == 0;}if (!limit && dp[pos][statu] != -1) return dp[pos][statu];Int sum = 0;int s, end = limit ? bit[pos] : 1;for (int i = 0; i <= end; ++i) {s = statu;if (i == 1) s = statu - 1;if (s < 0) continue;sum += dfs(pos-1, s, limit && i==end);}if (!limit) {dp[pos][statu] = sum; // 如果有限制的话,那么end的取值是并没有取全的 }return sum; }Int Cal(Int x) {len = -1;while (x != 0) { bit[++len] = x % b;x /= b;}if (b != 2) {// 对于不是2进制的数,我们需要将其转化为2进制进行求解// 若一个数被表示为 a1*b^e1 + a2*b^e2 + a3*b^e3 次方,那么这个数要能成为题目中要求的数// 就要在把这个数缩小的情况下不对解带来影响,所以我们选择从高位开始的第一个系数既// 不是0又不是1的位来进行处理,并把从这一位开始的后面的所有的位都变成1,这样就是舍弃了// 一部分一定不会成为解的数,但是有会所有解空间for (int i = len; i >= 0; --i) {if (bit[i] > 1) {for (int j = i; j >= 0; --j) {bit[j] = 1;}break;}}}return dfs(len, k, 1); }int main() { memset(dp, 0xff, sizeof (dp));while (scanf("%u %u %u %u", &x, &y, &k, &b) == 4) {x -= 1; printf("%u\n", Cal(y) - Cal(x));}return 0; }
转载于:https://www.cnblogs.com/Lyush/archive/2012/08/13/2636552.html
timus-1507 Amount of Degrees 按位DP相关推荐
- 【算法•日更•第十二期】信息奥赛一本通1585:【例 1】Amount of Degrees题解
废话不多说,直接上题: 1585: [例 1]Amount of Degrees 时间限制: 1000 ms 内存限制: 524288 KB 提交数: 130 通过数: 68 ...
- Amount of Degrees
ural 1057 Amount of Degrees 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K 个互不相等的B的整数次幂之和. 分析: 所求的数为互不相等的幂之和,即起B进制表 ...
- [压位DP]Hdu 6149——Valley Numer II
题目梗概 给定一个无向图,图中的点存在高低. 定义山谷为:一个低点连接两个相邻的高点. 求不相交的山谷的最大个数. 解题思路 一看这个高点个数<=15高点个数就马上想到压位DP. i表示前i个点 ...
- 2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp
F - 柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) ...
- 1026: [SCOI2009]windy数 (按位DP)
定义windy数:相邻数字的差至少是2的数,例如10不是windy数,而13是windy数.求给定区间中有多少windy数.区间端点范围为 [1, 2000000000] dfs写法 #include ...
- 【按位dp】文盲的学习方法
当年大神的文章 <浅谈数位统计问题> 对于没什么文化(x 没有充分时间或懒得看那么多理论 应付个水考试的我 eg:62问题 某大大的代码和分析 1 #include <iostrea ...
- LeetCode---数位DP
简介 数位DP是一种计数的DP,一般就是要统计一个区间[l,r]内满足一些条件的个数.所谓数位DP, 意思就是在数位(个位,十位,百位,,,)上进行DP. 对于这种问题的求解思路:先得出解ans[x] ...
- LOJ 一本通一句话题解系列:
第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...
- 提高篇 第五部分 动态规划 第3章 数位动态规划
例1 Amount of Degree(Ural 1057) URAL 1057 Amount of Degrees 数位dp_每天都要进步哦~-CSDN博客 Ural 1057. Amount of ...
最新文章
- 16.Hadoop架构再探讨第1部分
- [Redis6]发布和订阅
- python闯关_Day012
- C语言 __TIME__ - C语言零基础入门教程
- C++类型萃取之type_traits和type_info
- [VirtaulBox]网络连接设置
- input file获取文件路径_python 基础 — 整理文件
- wxpython 文本框TextCtrl
- 怎么修改某一软件的服务器,怎样设置一个软件服务器地址
- c语言多线程怎么写,如何用C语言实现多线程
- mock SpringMVC 测试控制器方法
- android仿qq空间、微信朋友圈图片展示
- tableau三轴该怎么做_举个栗子!Tableau技巧(30):巧妙实现 双柱图 和 折线图 的组合图表...
- [新功能]文章预览功能
- SPSS 中介效应检验(图文+数据集)【SPSS 043期】
- 2018版苹果开发者设置内购、税务、银行问题
- QML 图形渲染 - Displace
- 2022-11-18 mysql列存储引擎-assert failed on i < m_idx.size() at rc_attr.h:342-问题分析
- MyEclipse在启动了诸如Tomcat等web服务后,控制台信息不显示的问题
- three.js学习笔记(五)——Shadows阴影
热门文章
- mysql case break_按月转移日志表中日志时,mysql总是报‘MySQL server has gone away’这样的错!...
- 用css如何写正方体,css正方体实现--(transform练习)
- java swing 树_Java Swing JTree 树形
- 计算机网络:第六章 应用层
- 重庆二师计算机科学与技术,应用型本科院校计算机科学与技术专业一流课程建设思考──以重庆第二师范学院为例...
- java core日志在哪里_java-如何在未启用日志记录功能的情况下在...
- 三种方法实现Linux系统调用方法分享
- win服务器管理器“丢失”了怎么办?
- Win2003服务器设置防火墙图文教程
- poj3264 线段树