私はいくつかのプログラミング コンテストの質問を練習してきました (今後のコンテストの楽しみと練習のため)。
どこから始めればよいかよくわかりません=/。この問題を解決するには、どのようにアプローチすればよいですか?
私はいくつかのプログラミング コンテストの質問を練習してきました (今後のコンテストの楽しみと練習のため)。
どこから始めればよいかよくわかりません=/。この問題を解決するには、どのようにアプローチすればよいですか?
私には動的計画法の問題のように見えます
Fの再帰的定式化を見つけます。
それ以外の場合、F(w、h)=
For each allowable size a=i^2 <= min(w,h), try to place the a by a square (A)
in the top left corner.
One of the following possibilities will describe the
optimal solution:
+---+--+ +---+--+
| A | C| | A | |
+---+--+ +---+ |
| B | |B |C |
+------+ +---+--+
So, choose the best of
(1 + F(h-a, w) + F(h-a, w-a)) or
(1 + F(h-a, a) + F(w-a, h))
ナプキンでbig-O分析を行うと、これは-O(side^2 * sqrt(side))
っぽいアルゴリズムのようです。これが多すぎる場合は、次のことができます。
あなたを覚えている「1、2、4、8など」は何ですか?
図を見てください。あなたが選択するフィリングの順序(サイズの観点から)は何ですか?
手で答えを考え出すことから始めて、半ダース程度と言います...次に、プログラムで問題をどのように解決したかをモデル化します...そして、機能する「ブルートフォース」の答えが得られたら、さらに問題を解決してみてくださいエレガントに。
この問題は、最初に最大サイズのタイルをできるだけ多く配置してから、次に収まる最大サイズで可能な場所を埋めることから始めます。それから小さくなります...いっぱいになるまで。
配列または配列を使用して、埋められたスペースを空間的に追跡することができます...ただし、次元を取得して2つのうち小さい方を取得し、ログを利用するなど、いくつかの簡単な計算を介してこれを行う簡単な方法があると思いますベース2またはそのようなもの...
私は素敵なきちんとした再帰的な解決策があると確信しています..2のべき乗に基づいて..それから非再帰的な解決策にそれを解明することができます...