數字dp 求不超過n的數中,有多少個包含2018

2021-09-17 22:23:59 字數 1026 閱讀 6824

n的範圍是[0,1e9];

包含2018的意思是2018是該數的子串行,比如200176855,32018,5270168是符合條件的數, 2019,40017是不符合條件的數。

數字dp ,記憶化搜尋,從高位到低位,相當於是列舉所有的位,狀態包括處理到第多少位,目前希望匹配的是什麼(也就是希望得到2018中的哪個數),以及該位是否有限制(能不能取[0,9])

先數字分離,a[x]表示n的第x位,

dfs(x,nex,flag); //準備處理第x位,希望匹配到nex,flag==1表示有限制

根據flag和(nex與a[x]大小比較)來分類討論,x位能填的數字無非是nex,a[x],其他普通的數三類。

#include

#define ll long long

using namespace std;

const ll maxn=

1e5+7;

char s[maxn]

;int a[maxn]

;int n;

int dp[11]

[11][

2];int mm[10]

;int

dfs(

int x,

int nex,

int flag)

if(flag)

else

if(a[x]

else

if(a[x]

>nex)

}else

else

}//printf("dp[%d][%d][%d]=%d\n",x,nex,flag,ans);

return dp[x]

[nex]

[flag]

=ans;

}int

main()

dfs(1,

2,1)

;printf

("%d\n"

,dp[1]

[2][

1]);

return0;

}

leetcode中「有多少小於當前數字的數字」題解

給你乙個陣列 nums,對於其中每個元素 nums i 請你統計陣列中比它小的所有數字的數目。換而言之,對於每個 nums i 你必須計算出有效的 j 的數量,其中 j 滿足 j i 且 nums j nums i 以陣列形式返回答案。示例 1 輸入 nums 8 1,2 2,3 輸出 4,0,1,...

求N的階乘所得的數字末尾含有多少個0

給定乙個整數n 那麼n 的階乘n 末尾有多少個0呢?例如 n 10,n 3 628 800,n 的末尾有兩個0。初看這樣的題目可能會想到直接求出n!的階乘,然後再計算出0的個數。顯然用這種方法如果n很大的情況下,非常容易溢位。所以我們可以換個角度來分析這個問題。階乘 n!1 2 3 4 5 6 n ...

m表示為一些不超過n的自然數之和

設m,n均為自然數,m可表示為一些不超過n的自然數之和,f m,n 為這種表示方式的數目。例 f 5,3 5,有五種表示方式 3 2,3 1 1,2 2 1,2 1 1 1,1 1 1 1 1 include int f int m,int n int main int f int m,int n ...