【數位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 當前處理的位前面已經有的1個數
limit 當前位有沒限制
其實dp可以看作記錄過程答案的dfs。(即是記憶化搜尋) 可以把這題當作dfs做。
對於 0 ~ 4321 有多少個1呢?
圖:
修正:雖然這題過掉了,後來做 hdu 2098 ,根據我自己的理解碼程式碼,無限wa,不知道是錯在哪裡,後來強行手跑程式碼,發現先前的理解不準確。
進一步理解:數位dp的記憶化搜尋不能理解為邊爆搜邊記錄,這樣是沒有意義的(之前腦子懵),如上圖:它先在最深一層搜10次(0000~0009),記錄dp值,運用在最後第二層搜10次(001X~009X)上,以此類推,搞出所有需要的dp值無非只搜了 (位數*10)次;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<map>
#include<queue>
#include<cmath>
#include<algorithm>
#include<deque>
typedef long long LL;
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
const int INF=0x3f3f3f3f;
const int N = 20;
const double eps = 1e-6;
int ten[N]; //10^i 的值
void init()
{
ten[0] = 1;
for(int i = 1; i < 10; i++)
ten[i] = ten[i-1]*10;
}
char s[N];
int len;
int dp[N]; //0->10^i-1 中1的個數
int dfs(int pos,int num, int limit)
{
if(pos == len)
return num;
if(!limit && dp[len-pos-1] != -1)
return num*ten[len-pos]+dp[len-pos-1];
int up = limit ? s[pos]-'0' : 9;
int tmp = 0;
for(int i = 0; i <= up; i++)
tmp += dfs(pos+1,num+(i==1),limit && s[pos]-'0' == i);
if(!limit)
dp[len-pos-1] = tmp;
return tmp;
}
int main()
{
init();
scanf("%s",s);
len = strlen(s);
memset(dp,-1,sizeof(dp));
printf("%d\n",dfs(0,0,1));
return 0;
}
相關文章
- 1082. 數字遊戲 (數位DP)遊戲
- leedcode 位1的數量
- 【數位dp】學習
- hdu5435 數位dp(大數的處理)
- 根據數字二進位制下 1 的數目排序排序
- 學習筆記:數位dp筆記
- 數位DP 學習筆記筆記
- 統計位數為偶數的數字(C++)C++
- poj3252 數位dp(所有比n小的二進位制位0的個數不少於1的個數)記憶化搜尋
- CodeForces - 628D (數位dp)
- Antd中InputNumber元件數字限制小數位數元件
- 力扣 根據數字二進位制下1的數目排序力扣排序
- JavaScript數字自定義位數補零JavaScript
- CodeForces 401D 數位DP
- 千分位分隔數字並自定義保留小數位數
- 對十進位制數字的按位輸出,取反,並求其位數
- poi匯出的excel的數字小數位過多?Excel
- 【數位dp】Beautiful numbers CodeForces - 55D
- 對陣列中的數字 1 和 2 進行排序,使得數字 1、2 分別位於前、後部分陣列排序
- 數字人輕鬆學Xpresso入門-5
- 力扣1356.根據數字二進位制下1的數目排序力扣排序
- 使用 Haskell 將十進位制數字轉成羅馬數字Haskell
- oracle 一欄位 資料存在數字和漢字,只提取數字的sqlOracleSQL
- js如何實現數字保留小數點後兩位小數JS
- input 限制字數輸入時候 限制字數會出現負數
- Java中計算整數中唯一數字數量的3種方法Java
- ACM n-1位數ACM
- 基礎1:有四個數字:1、2、3、4,能組成多少個互不相同且無重複數字的三位數?
- 讀入一個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。
- 位運算--求一個 數二進位制中1的個數
- leetcode.1356. 根據數字二進位制下 1 的數目排序LeetCode排序
- leetcode-1356. 根據數字二進位制下 1 的數目排序LeetCode排序
- leetcode1356. 根據數字二進位制下 1 的數目排序LeetCode排序
- JavaScript生成四位數字或者字母隨機數JavaScript隨機
- [CareerCup] 5.5 Number of Converted Bits 轉換數字所需的位數
- BZOJ 3329 Xorequ:數位dp + 矩陣快速冪矩陣
- SQL 判斷欄位是否以數字開頭或者包含數字SQL
- Java入門教程五(數字和日期處理)Java