题目链接:https://vjudge.net/problem/HDU-4734
题目大意:求区间[l,r]内满足数x的F(x)<=F(a)的数的个数。
对于一个n位的数(AnAn-1An-2....A1),F(x)=An*2^(n-1)+An-1*2^(n-2)+...+A1*1.
题解:
首先我们肯定要维护一个状态sum表示枚举到pos位数的前面的数位的F(x)值,最后判断一下是否大于F(a)就行了。
因为F(x)最大为4599.所以这样是存的下的。
但是我们还需要再开一维存预先求出来的F(a),用来记录每一操作时对应的F(a)。
如果不用的话直接每次操作时都memset会超时。
但是这样一来空间又不够了,因此我们需要考虑一种状态既不需要存F(a),memset又可以在外面执行。
这里就体现了减去的艺术了。
定义新的状态为dp[pos][sum]表示枚举到当前pos位,后面还需要凑sum的权值和的个数。
至于为什么这样是可行的呢。
我们可以这样考虑,虽然F(a)是变的,但是每次大的F(a)总会用到小的F(a)。
而小的F(a)不会因为大的F(a)的改变而改变,因此大的sum会用到小的sum,但是小的sum不会因为F(a)的改变而改变。
代码实现:
#pragma GCC optimize(2)
#include
#include
#include
#include
#include
#include
#include
#include
作者:木每立兄豪
数位dp
dp
hdu
艺术