1. 程式人生 > >數位dp入門(不含49)

數位dp入門(不含49)

給一個數字n,範圍在1~2^63-1,求1~n之間含有49的數字有多少個。

思想:總數-不含49的數;

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>

#prag\
ma GCC optimize("O3")

using namespace std;

typedef long long LL;

typedef unsigned long long uLL;

#define REP(i, a, b) for(register LL i = (a), i##_end_ = (b); i <= i##_end_; ++ i)
#define DREP(i, a, b) for(register LL i = (a), i##_end_ = (b); i >= i##_end_; -- i)
#define mem(a, b) memset((a), b, sizeof(a))

template<typename T> inline bool chkmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }

LL read()
{
    register LL sum = 0,fg = 0;char c = getchar();
    while(c < '0' || c > '9') { fg |= c == '-'; c = getchar(); }
    while(c >= '0' && c <= '9') { sum = sum * 10 + c - '0'; c = getchar(); }
    return fg ? -sum : sum;
}

const LL inf = 1e9;
const LL maxn = 100000;

LL T,a[maxn],num;
LL dp[maxn][2];

LL dfs(int pos,int pre,bool lim)
{
    bool flag = (pre == 4);//也可以把flag作為函式引數;
    if(pos == 0)return 1;
    if(!lim && dp[pos][flag]!=-1)return dp[pos][flag];
    int up = lim ? a[pos] : 9;//判斷上限
    LL res = 0;
    REP(i,0,up)
    {
        if(pre == 4 && i == 9)continue;//不符條件
        res += dfs(pos-1,i,lim && i == a[pos]);
    }
    if(!lim) dp[pos][flag] = res;
    return res;
}

LL solve(LL x)
{
    num = 0;LL tmp = x;
    while(x) {a[++num] = x % 10;x /= 10;}
    return tmp - dfs(num,-1,1);
}

int main()
{
    T = read();
    mem(dp,-1);
    while(T--)
    {
        LL x = read();
        cout<<solve(x)+1<<endl;
    }
    return 0;
}

相關推薦

數位dp入門(49)

給一個數字n,範圍在1~2^63-1,求1~n之間含有49的數字有多少個。 思想:總數-不含49的數; #include<iostream> #include<cstdio> #include<cstdlib> #include&l

hdu 2089 不要62 數位DP入門

dfs += ret memset tro int 入門 space spa 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=2089 題意: 統計區間 [a,b] 中不含 4 和 62 的數字有多少個。 思路: 學習了數位d

數位dp入門】【HDU2089】62

ret main ont scanf size hdu2089 con %d tmp 為了我的點歪的技能樹…… 所以開始補一些sb的東西…… #include<bits/stdc++.h> typedef long long ll; using namespa

51nod 1009 數位dp入門

ext 一位 group code 1出現的次數 alt 收藏 算法 lis http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 1009 數字1的數量 基準時間限制:1 秒 空間限制:131

hdu3555 Bomb (數位dp入門題)

accep ota line -c them eight otto time test case Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others

數位DP入門

利用 bsp 總結 ret while 說明 sub 體會 但是 數位DP其實是很靈活的,所以一定不要奢求一篇文章就會遍所有數位DP的題,這一篇只能是講清楚一種情況,其他情況遇到再總結,在不斷總結中慢慢體會這個思想,以後說不定就能達到一看到題目就能靈活運用的水平。(其實DP

hdu 2089 不要62 數位dp入門

stream 然而 != 1的個數 tdi 記憶化 代碼 pan += 題意:求一個範圍內的數字,約束條件為不含有數字4以及62 typedef long long ll; int a[20]; ll dp[20][state];//不同題目狀態不同 ll d

HDU-2089不要62-暴力或數位DP入門

之前 scanf href esp ostream += log main string 不要62 題意:給定區間,求在這個區間中有多少個數字,不包含4且不包含62; 這道題作為數位DP的入門題; 暴力也是可以過 #include<cstdio> #inclu

HDU 2089 不要62【數位DP入門題】

pan eps ava con 所有 數據 strong mon sub 不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi

數位dp入門-windy數

算法 並且 我們 等於 smc 發現 滿足 bug 為我 我真是太弱了!!!!!! 顯然的數位dp,一開始我too young too simply的用dp[i][j]表示考慮到了第 i 位,且這一位的數是j的數量。但是,經過SMc的指點後,我發現這個沙雕的方程具有後效性,

數位DP入門專題禮包已經出現~

題目入口:AFei的鍊金術修行之數位DP 題目難度排序:D<F<A<B<E<C<H<G 哇,這套題我做了三次,終於給AK了,陸陸續續差不多做了一個月吧,碰到類似的題已經能夠很快地想到思路了,就很蘇福~~   何謂數位DP 數

數位DP入門 HDU 2089 不要62 註釋詳解

題意:輸出一個區間【m,n】內所有不含“62"and"4" 的數字個數;n<=10^7;  數位dp一般應用於:   求出在給定區間[A,B]內,符合條件P(i)的數i的個數.   條件P(i)一般與數的大小無關,而與 數的組成 有關. 具體的理論過程我就不解釋

hdu 3555 Bomb(數位dp入門

Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 24148    Accepted Submissi

ural 1057 Amount of degrees 數位DP (入門)

/** * 數位dp: * 第一道數位dp題,還是看《淺談數位類統計問題》看到的題, * 關於數位dp的理解,理解那棵完全二叉樹就很容易理解了。 * 關鍵是對於非二進位制的計數是如何根據二進位制得出來的dp去計算的,、 * 拿5進位制來說,

數位dp入門(第幾個含有666的數)

求第n個含有666的數。 #include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #include<string.h> #

數位DP入門 —— hdu2089 不要62

數位DP是一種用來計數的DP, 如果給你一道題, 讓你去統計區間[l, r]之間滿足某種條件的數字個數, 在沒接觸數位之前很容易想到的就是暴力判斷。但當資料範圍較大時這種方法就不可行了, 這時候我們就可能要用的差分的思想確定一個遞推關係, 來更方便更高效的求解, 這就是數位D

HDU2089——不要62(數位dp入門

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 35612    Accepted Submiss

【HDU2089】不要62(數位DP入門題)

Description 給定mm,nn,求mm到nn的所有整數中及不含’4’也不含’62’的數的個數。 Solution 直接數位DP即可。。。 Source /*************

數位dp入門】51nod 1009 數字1的數量

給定一個十進位制正整數N,寫下從1開始,到N的所有正數,計算出其中出現所有1的個數。 N(1 <= N <= 10^9) dp[i] 表示 0 ~ (10 ^ i - 1) 中1的個數。 ten[i] 表示 10 ^ i 的值 pos 當前處理的位 num 當

hdu2089——不要62(數位DP入門)

題意 杭州人稱那些傻乎乎粘嗒嗒的人為62(音:laoer)。  杭州交通管理局經常會擴充一些的士車牌照,新近出來一個好訊息,以後上牌照,不再含有不吉利的數字了,這樣一來,就可以消除個別的士司機和乘客的心理障礙,更安全地服務大眾。  不吉利的數字為所有含有4或62的號碼。