この問題は、単純に O(n 3 ) 時間で簡単に解決できます。問題は次のようなものです。
数直線上には N 個の固有点があります。一定の間隔で数直線上のすべての点をカバーしたいとします。間隔はどこにでも配置できます。間隔を作成するにはコストがかかり
B + MX
ます。ここで、 は間隔をB
作成する初期コストであり、X
は間隔の長さの半分M
であり、 は間隔の長さあたりのコストです。すべての間隔をカバーするための最小コストを見つけたいとします。
サンプルデータ:
Points = {0, 7, 100}
B = 20
M = 5
20 + 3.5×5 のコストで間隔 [0,7] を構築し、コスト 100 + 0×5 で [100,100] の間隔を構築できるため、最適解は 57.50 になります。合計すると 57.50 になります。
私は O(n 3 ) ソリューションを持っています。ここで、DP は からのポイントをカバーするための最小コスト[left, right]
です。したがって、答えは になりますDP[1][N]
。すべてのペアについて、(i,j)
反復しk = {i...j-1}
て計算するだけDP[i][k] + DP[k + 1][j]
です。
ただし、このソリューションは O(n 3 ) (行列乗算のようなものだと思います) であるため、N > 2000 では遅すぎます。これを最適化する方法はありますか?