數位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的號碼。