hdu 4734 F(x) 数位dp

题意:定义 F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1(其中 x = AnAn-1An-2 ... A2A1),那么给定A,B,求[0,B]区间的i,满足F(i)<=F(A)

的个数。

思路:设dp[ pos ] [ k ]为当前考虑pos位,之后(pos + 1)位与之前的位数组合形成的F函数值不超过k的数的个数,详见代码:

/*********************************************************
  file name: hdu4734.cpp
  author : kereo
  create time:  2015年01月20日 星期二 11时09分03秒
*********************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int sigma_size=26;
const int N=10;
const int MAXN=6000+50;
const int inf=0x3fffffff;
const double eps=1e-8;
const int mod=100000000+7;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define PII pair
#define mk(x,y) make_pair((x),(y))
int res;
int bit[N],dp[N][MAXN],a[N],p[N];
int dfs(int pos,int st,int flag){
    if(pos == -1) return 1;
    if(flag && dp[pos][st]!=-1)
        return dp[pos][st];
    int ans=0;
    int x=flag ? 9 : bit[pos];
    for(int i=0;i<=x;i++){
        int k=st-(int)p[pos]*i;
        if(k<0)
            continue;
        ans+=dfs(pos-1,k,flag || i


你可能感兴趣的:(数位dp)