科協裡最近很流行數字遊戲。
某人命名了一種不降數,這種數字必須滿足從左到右各位數字呈非下降關係,如 123,446。
現在大家決定玩乙個遊戲,指定乙個整數閉區間 [a,b],問這個區間內有多少個不降數。
輸入格式
輸入包含多組測試資料。
每組資料佔一行,包含兩個整數 a 和 b。
輸出格式
每行給出一組測試資料的答案,即 [a,b] 之間有多少不降數。
資料範圍
1≤a≤b≤231−1
輸入樣例:
1 91 19
輸出樣例:918
利用類似字首和的思想 [a, b]範圍滿足要求的數=[0,b]範圍滿足要求的數 - [0,a-1]範圍滿足要求的數
所以我們可以封裝求[0, x]滿足要求的數字為乙個函式即可
乙個數字x, 最右邊當成第一位,數字長度為len的話,最左側就為第len位,把他們儲存到a陣列中。
從最左側開始搜尋, pos記錄列舉哪一位了, 需要記錄前一位數字pre,pre如果比當前列舉的數字i大的話,就continue不予統計。
需要用乙個limit記錄當前位能列舉的上界,比如19 這個2位數,最左側一位能列舉的範圍是0-1, 不能超過1,
如果limit為false當前位能列舉到9,否則只能到最大a[pos]
dfs的含義就是從左往右列舉每一位,看是否符合要求。
為了優化,記憶化即可,需要注意有limit的情形不能用記憶化,比如求 132以內滿足要求的數字,
列舉到第二位達到3時(13?), dp[2][3]表示2位數,最左側以3開頭,3339都符合要求(133139),所以dp[2][3]=7。但132的第一位的上界是2,不能超過這個數字,所以不能用記憶化的結果,應該返回0。
#include
using
namespace std;
int dp[32]
[10];
int a[32]
;int len;
intdfs
(int pos,
int pre,
int limit)
return limit?cnt:dp[pos]
[pre]
=cnt;
}int
solve
(int x)
return
dfs(len,0,
true);
}int
main()
return0;
}
數字DP 數字遊戲
科協裡最近很流行數字遊戲。某人命名了一種不降數,這種數字必須滿足從左到右個位數字呈現小於等於的關係,如123,446.現在大家決定玩乙個遊戲,指定乙個整數閉區間 a,b 問這個區間內有多少個不降數。輸入多組測試資料。每組只包含兩個數字a和b 1 a,b 2 31 每行給出乙個測試資料的答案,即 a,...
數字遊戲 (dp)
problem description 丁丁最近沉迷於乙個數字遊戲。這個遊戲看似簡單,但丁丁在研究了很多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加後得的m個結果對10取模後再相乘,最終得...
DP 數字遊戲
小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,a 3,an,a1,a2,a3,an,a1,a2,a3,an 然後給你m mm個回合的機會,每會回你可以從中選擇乙個數字擦去它,接著剩下來的每個數字aiai ai都要遞減乙個值bibi bi。如此重複m mm個回合,所有你擦去的數字之和就是你所...