程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> hdu 4734 F(x) 數位dp

hdu 4734 F(x) 數位dp

編輯:關於C++

題意:定義 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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved