壹、題目描述 ¶
貳、題解 ¶
前言
只能說什么結論都想不到了,真的啊......至少打個表嘛,這樣或許還能發現 \(\forall i,f(i)\le 5\) 這個結論......
正文
將用 \(1,2,3\) 組成的數成為好的。那么我們的題意就變成,對於一個 \(N\),最少需要多少個好的數能夠組成它。
◆ 好數之和的結構
我們將一個數 \(A_i\) 寫成 \(A_i=10a_i+b_i\),那么,如果 \(A_i\) 是好的,它一定同時滿足:
- \(b_i\in\{1,2,3\}\);
- \(a_i\) 是一個好數或者 \(0\);
所以,如果一個數能夠被 \(K\) 個好數之和所表示,一定是以下兩部分之和:
- 一個在 \([K,3K]\) 范圍內的整數;
- 至多 \(K\) 個好數之和乘上 \(10\);
然后,我們可以使用一個比較暴力的 \(\rm DP\) 來解決問題。
◆ \(\rm DP\) 的設計
定義 \(f(i)\) 表示 \(i\) 最少可以被多少好數之和所表示。
假設對於 \(N\),我們已經知道了 \(f(x)(x<N)\) 的值,那么,我們可以設計下面的轉移:
首先,暴力從小開始枚舉一個 \(K\),表示 \(N\) 能被多少好數所表示,那么我們這樣轉移:
- 枚舉一個 \(r\in[K,3K]\);
- 如果存在 \(x\) 滿足 \(N=10x+r\;\and\;f(x)\le K\),那么 \(N\) 即可表示為 \(K\) 個好數之和;
至於復雜度?似乎和 \(K\) 有關。但是 \(K\) 上界會是多少呢?
◆ \(K\) 的上界以及時間復雜度
對於 \(K\) 的上界,我們可以使用歸納法證明:
- \(\forall i\in [1,10],f(i)\le 5\),打表或者手玩.....;
- \(\forall N>10,\exists K\le 5,r\in[K,3K]\;\text{s.t.}\;N-r=\left\lfloor{N\over 10}\right\rfloor\),所以上界很容易發現是 \(5\),這是最大情況了;
那么,復雜度就有了保障,我們不用做 \(\rm DP\),直接暴力搜就可以了。
叄、關鍵之處 ¶
顯然,題解分析是從 好數本身 再到 好數之和,有時候不要太冒進了,分析基礎的東西才是關鍵。