数位dp H - F(x) HDU - 4734
http://acm.hdu.edu.cn/showproblem.php?pid=4734
一般数位dp表示的是数的性质,这个题目也是一样,但是我们求出来的是一个函数的值,怎么把这个值转化成一类数,然后再用dp数字来表示这个数的性质呢?
这个我觉得挺麻烦的,很自然发现了这个f[x]并不是很大,最大应该就是10000左右,所以就可以放入数组里面表示
所以就有dp[pos][sum] 但是呢,这个是有问题的,因为如果你用sum来表示前缀和,那就无法进行记忆化,这个dp数组就会出现问题。
然后我就懵了,然后没忍住又去看了一下题解,题解说后面的那维不存前缀和sum,而是存ex-sum 表示前面以及有了sum后面还需要ex-sum这个的数的个数
然后这个就是对的了,至于为什么,你可以理解为我要求一类数,这类数有pos位,然后后面这类数的f(x)必须小于等于sum,这就是一种数的性质。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <vector>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e5 + ;
typedef long long ll;
int a[]; int f(int x)
{
int pos = ;
int ans = ;
while(x)
{
ans += (x % )*( << pos);
x /= ;
pos++;
}
return ans;
} int ex;
int dp[][]; int dfs(int pos,int sum,bool limit)
{
if (pos == -) return sum <= ex;
if (sum > ex) return ;
if (!limit&&dp[pos][ex-sum] != -) return dp[pos][ex-sum];
int up = limit ? a[pos] : ;
int ans = ;
for(int i=;i<=up;i++)
{
ans += dfs(pos - , sum + i * (<<pos), limit && (i == up));
}
if (!limit) dp[pos][ex-sum] = ans;
return ans;
} ll solve(ll x)
{
int pos = ;
while(x)
{
a[pos++] = x % ;
x /= ;
}
return dfs(pos - , , );
} int main()
{
int t;
scanf("%d", &t);
memset(dp, -, sizeof(dp));
for(int cas=;cas<=t;cas++)
{
int x, y;
scanf("%d%d", &x, &y);
ex = f(x);
int ans = solve(y);
printf("Case #%d: %d\n",cas, ans);
}
return ;
}
数位dp
数位dp H - F(x) HDU - 4734的更多相关文章
- 递推、数位DP解析(以HDU 2089 和 HDU 3555 为例)
HDU 2089 不要62 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2089 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人 ...
- (数位dp)Bomb (hdu 3555)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...
- F(x) HDU - 4734
题意: 给你一个n位的数x(A(n)A(n-1)...A(1)),那么F(x)=A(n)*2^(n-1)+A(n-1)*2^(n-2)......+A(1)*2^(0) 题目输入A.B 你需要找出来在 ...
- 【HDU 3709】 Balanced Number (数位DP)
Balanced Number Problem Description A balanced number is a non-negative integer that can be balanced ...
- 蒟蒻的数位DP专题总结
BZOJ 1026: [SCOI2009]windy数: 题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1026 d ...
- BZOJ_1026_[SCOI2009]windy数_数位DP
BZOJ_1026_[SCOI2009]windy数_数位DP 题意:windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之 ...
- [SDOI2016]储能表——数位DP
挺隐蔽的数位DP.少见 其实减到0不减了挺难处理.....然后就懵了. 其实换个思路: xor小于k的哪些都没了, 只要留下(i^j)大于等于k的那些数的和以及个数, 和-个数*k就是答案 数位DP即 ...
- UOJ #86 mx的组合数 (数位DP+NTT+原根优化)
题目传送门 matthew99神犇的题解讲得非常清楚明白,跪烂Orzzzzzzzzzzzzz 总结一下,本题有很多重要的突破口 1.Lucas定理 看到n,m特别大但模数特别小时,容易想到$lucas ...
- 【学习笔记&训练记录】数位DP
数位DP,即对数位进行拆分,利用数位来转移的一种DP,一般采用记忆化搜索,或者是先预处理再进行转移 一个比较大略的思想就是可以对于给定的大数,进行按数位进行固定来转移记录答案 区间类型的,可以考虑前缀 ...
随机推荐
- Shell 变量引用实例
初学 Shell 编程时,对变量各种引用使用不太熟悉,走了很多弯路,本文记录变量引用的一些用法,希望对大家有所帮助. 引用 引用指将字符串用引用符号引起来,以防止特殊字符被 shell 脚本解释为其他 ...
- python在办公时能给我们带来什么?
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:谦睿科技教育 PS:如有需要Python学习资料的小伙伴可以加点击下方 ...
- Beta-release 目标
在第二个release开发周期中我们首要先要完成的是对第一个发布版本的优化:(之前团队在跟travis的沟通中,travis也要求我们首先要把现在已有的feature做到一个比较成熟和稳定的版本) 1 ...
- A - Number Sequence 哈希算法(例题)
Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M ...
- 6. webRTC
webrtc网上封装的很多,demo很多都是一个页面里实现的,今天实现了个完整的 , A 发视频给 B. 1.) A 方 <!DOCTYPE html> <html id=" ...
- Java实现链表(个人理解链表的小例子)
1.单链表和数组的区别 数组:数组的存储空间是连续的,需要事先申请空间确定大小,通过下标查找数据,所以查找速度快,但是增加和删除速度慢 链表:离散存储,不需要事先确定大小,通过头指针加遍历查找数据,查 ...
- Java 多线程 -- volatile 山寨版的synchronized
在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据.但是,当线程特别忙时,就不会去 ...
- 关于go的通信通道channel——chan的一些问题
go版本 1.8 chan类型的声明,有以下几种: var c chan int c := make(chan int) //slice.map.chan都可以通过用make来初始化,其中map.ch ...
- 20199326《Linux内核原理与分析》第十一周作业
Shellsock攻击实验 实验背景 2014年9月24日,Bash中发现了一个严重漏洞shellshock,该漏洞可用于许多系统,并且既可以远程也可以在本地触发. Shellshock,又称Bash ...
- windows 查看被占用的端口信息
如何查询 1.使用命令:netstat -aon|findstr "8080" 查询被占用的端口的进程 PID 2.使用命令:tasklist | findstr "15 ...