Seperti yang disarankan @randomA, kami akan melanjutkan dalam dua tahap: Pertama-tama kami menemukan set tongkat yang akan dipotong dan kemudian meminimalkan jumlah potongan.
Seperti dalam kasus khusus dalam pertanyaan, kami mengurutkan / memberi nama tongkat sehingga . Ini membutuhkan waktu O ( n log n ) .L.1≥ L2≥ ⋯ ≥ LnO(nlogn)
Seperti yang ditunjukkan oleh @ user1990169, kita tidak perlu memotong sepotong .i≥k
Pada fase pertama kami menggunakan pencarian biner untuk menemukan angka , 1 ≤ s ≤ k , sehingga tongkat 1 , ... , s dapat dipotong menjadi setidaknya k keping ukuran L s (ditambah beberapa keping yang lebih kecil), tetapi tongkat 1 , … , s - 1 tidak dapat dipotong menjadi k potong berukuran L s - 1 . Ini akan membutuhkan waktu O ( k log k ) .s1≤s≤k1,…,skLs1,…,s−1kLs−1O(klogk)
Jika , nilai ini adalah ukuran optimal dan kita dapat melewati fase dua.Ls−1=Ls
Jika tidak kita tahu bahwa ukuran optimal memenuhi L s - 1 > o ≥ L s dan jika o > L s kemudian o hasil dari pemotongan setidaknya satu dari tongkat-potong berukuran sama. Fase dua akan menentukan o :oLs−1>o≥Lso>Lsoo
Untuk setiap tongkat , 1 ≤ i ≤ s , menentukan satu set ukuran kandidat sebagai berikut: Jika memotong menjadi potongan-potongan ukuran L s bergantian tongkat ke dalam r i buah (termasuk yang lebih pendek, jika ada), maka calon ini tongkat adalah semua nilai L ii1≤i≤sLsri , di manaj≤ridanLiLijj≤ri. (Lihatjawaban @ user1990169untuk alasan mengapa ini adalah satu-satunya ukuran kandidat.)Lij<Ls−1
Pertahankan untuk setiap ukuran kandidat, seberapa sering hal itu terjadi. Menggunakan pohon pencarian yang seimbang, ini dapat dilakukan di , karena jumlah total ukuran calon terikat oleh Σ i r i ≤ 2 k .O(klogk)∑iri≤2k
Sekarang ukuran kandidat yang paling sering terjadi dan mengarah ke pemotongan yang valid adalah yang memberikan kita solusi optimal. Selain itu, jika ada ukuran kandidat yang mengarah ke pemotongan yang valid, ukuran yang lebih kecil akan mengarah ke pemotongan yang valid juga.
Jadi kita dapat lagi menggunakan pencarian biner untuk menemukan panjang kandidat terbesar yang mengarah ke pemotongan valid . Kemudian kita beralih pada kumpulan panjang kandidat hingga ambang ini dan menemukan satu dengan banyak terbesar di antara mereka di O ( k ) .O(klogk)O(k)
Secara total kita mendapatkan runtime di , atau O ( k log k ) , jika kita mengabaikan (atau tidak harus melakukan) jenis awal.O(nlogn)O(klogk)