ABC114 C問題 : 755

問題. 755

整数  N が与えられる. 1 以上  N 以下の整数のうち,各桁が数字 '3', '5', '7' のいずれかで,かつ,'3', '5', '7' の数字が少なくとも1回以上現れるものの数を求めよ.

制約 1 \le N < 10^9

解法1. 全列挙

条件を満たす整数を再帰関数で全列挙します. N の桁数は高々9なので全列挙をしても  3^9 に比例する時間しかかかりません.

計算時間 O(3^s) s N の桁数)

解法2. 桁DP

 N の桁数による動的計画法である桁DP(Digit DP)を行います.漸化式 dp[i][j][k][l] を,上位  i 桁目までの数字を決めていて,上位  i + 1 桁目で数字を自由に選べるかどうかのフラグを  j として,現在までに数字を書き込んだかのフラグを  k として,今までで '3', '5', '7' を少なくとも1回選んだかどうかのフラグを  l としたときの,それを満たす整数の個数と定義します. N の桁数を  s としたとき,答えは dp[s][0][1][7] + dp[s][1][1][7] となります.これは,すべての桁数を決めたときに,数字が書かれており,'3', '5', '7' が少なくとも1回書かれているときの数となります.漸化式はソースコードを参照してください.

計算時間 O(s) s N の桁数)

まとめ

桁DP はなかなか思考に時間がかかるな.あとパラメータが増えると vector<vector<vector<vector<int>>>> となって険しい.