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 ...