1秒以内に任意のn<=600の最短の加算チェーン(sac)をどのように計算できますか?
ノート
これは今月のコディリティに関するプログラミングコンテストです。
加算チェーンは、x ^ nを(連続した乗算によって)計算するための最も経済的な方法であるため、数値的に非常に重要です。
KnuthのArtofComputer Programming、Volume 2、Seminumerical Algorithmsには、加算チェーンといくつかの興味深いプロパティの優れた紹介がありますが、厳密なパフォーマンス要件を満たすことができるものは見つかりませんでした。
私が試したこと(ネタバレ注意)
最初に、(高度に分岐した)ツリーを構築しました(開始1-> 2->(3-> ...、4-> ...))。各ノードnについて、ルートからnへのパスがnの袋です。ただし、値が400を超える場合、実行時間はコーヒーを作る場合とほぼ同じです。
次に、そのプログラムを使用して、検索スペースを削減するためのいくつかの便利なプロパティを見つけました。これで、コーヒーを作りながら、600までのすべてのソリューションを構築することができます。しかし、nの場合、nまでのすべての解を計算する必要があります。残念ながら、codilityはクラス初期化の実行時間も測定します...
問題はおそらくNP困難であるため、ルックアップテーブルをハードコーディングすることになりました。でも、codilityがsacの作成を依頼したので、ルックアップテーブルを念頭に置いているかどうかわからないので、汚くて詐欺師のように感じます。したがって、この質問。
アップデート
ハードコーディングされた完全なルックアップテーブルが進むべき道だと思う場合、完全な計算/部分的に計算されたソリューション/ヒューリスティックが機能しないと思う理由を説明できますか?