Misalkan kita diberi daftar poin, yang koordinat dan semuanya non-negatif. Misalkan juga tidak ada duplikat poin. Kita hanya bisa beralih dari titik ke titik jika dan . Pertanyaannya adalah: mengingat poin ini, berapakah jumlah poin maksimum yang dapat kita capai jika kita diizinkan untuk menggambar dua jalur yang menghubungkan titik menggunakan aturan di atas? Jalur harus dimulai dari titik asal dan dapat berisi titik yang berulang. tentu saja tidak termasuk dalam poin yang dicapai.n
Contoh: diberikan , jawabannya adalah karena kita dapat mengambil dan .(2,0),(2,1),(1,2),(0,3),(1,3),(2,3),(3,3),(2,4),(1,5),(1,6)
Jika kita diizinkan untuk menggambar hanya satu jalur, saya dapat dengan mudah menyelesaikan pertanyaan dengan pemrograman dinamis yang berjalan di . Saya pertama-tama mengurutkan poin dengan mengurangi . Biarkan menjadi jumlah maksimum koin yang dapat diambil seseorang dari koin hingga dalam daftar yang diurutkan. Kemudian dan . Maka jawabannya adalah \ max \ limit_ {1 \ le i \ le n} D [i] + 1 .O(n2)
Tapi saya tidak bisa menemukan hubungan berulang untuk dua jalur. Jika ada yang tahu tentang hubungan yang berulang seperti itu, saya akan senang mendengarnya.
Jawaban:
Masalahnya, disajikan kembali dan digeneralisasi: diberi himpunan terbatas dilengkapi dengan perintah parsial , temukan rantai memaksimalkan . Pertanyaannya adalah tentang kasus di mana dan .SS ≤≤ C1,C2⊆SC1,C2⊆S |C1∪C2||C1∪C2| S⊆R2+S⊆R2+ (x,y)≤(z,w)⟺x≤z∧y≤w(x,y)≤(z,w)⟺x≤z∧y≤w
Secara naif, orang mungkin mencoba menemukan rantai tunggal terbaik di , di mana yang terbaik diukur dengan berapa banyak nilai yang berbeda dari komponen-komponen rantai itu. Sayangnya, satu komponen dapat menelusuri kembali langkah-langkah yang lain, misalnya, sehingga gagasan terbaik ini tidak memiliki substruktur yang optimal.S2S2 ((0,0),(0,0))<((1,0),(0,0))<((2,0),(0,0))<((2,0),(1,0)),
Sebagai gantinya, kami mencari rantai di himpunan . Dengan mensyaratkan bahwa komponennya sama atau tidak ada bandingannya, kita mencegah penelusuran ulang tetapi sekarang perlu berargumen bahwa beberapa rantai terbaik sesuai dengan persyaratan baru.T:={(x,y)∣(x,y)∈S2∧x≮y∧y≮x}T:={(x,y)∣(x,y)∈S2∧x≮y∧y≮x}
Lemma 1 (tanpa retacing). Biarkan menjadi sebuah rantai dan tentukan dan . Untuk semua , kita memiliki jika dan hanya jika .C⊆TC⊆T C1:={x∣(x,y)∈C}C1:={x∣(x,y)∈C} C2:={y∣(x,y)∈C}C2:={y∣(x,y)∈C} z∈Sz∈S z∈C1∩C2z∈C1∩C2 (z,z)∈C(z,z)∈C
Bukti. Arah jika sepele. Dalam hanya jika arah, untuk semua , terdapat sehingga . Karena adalah suatu rantai, . Asumsikan secara simetris bahwa , yang menyiratkan bahwa . Kita tahu dengan definisi yang , sehingga , dan .z∈C1∩C2z∈C1∩C2 x,y∈Sx,y∈S (x,z),(z,y)∈C(x,z),(z,y)∈C CC (x,z)≤(z,y)∨(z,y)≤(x,z)(x,z)≤(z,y)∨(z,y)≤(x,z) (x,z)≤(z,y)(x,z)≤(z,y) x≤z≤yx≤z≤y TT x≮z∧z≮yx≮z∧z≮y x=z=yx=z=y (z,z)∈C(z,z)∈C
Lemma 2 (keberadaan rantai terbaik terbatas). Untuk semua rantai , terdapat rantai sehingga dan .C1,C2⊆SC1,C2⊆S C⊆TC⊆T C1⊆{x∣(x,y)∈C}⊆C1∪C2C1⊆{x∣(x,y)∈C}⊆C1∪C2 C2⊆{y∣(x,y)∈C}⊆C1∪C2C2⊆{y∣(x,y)∈C}⊆C1∪C2
Bukti (direvisi). Kami memberikan algoritma untuk membangun . Untuk kenyamanan, mendefinisikan penjaga sehingga untuk semua . Biarkan dan .CC ⊥,⊤⊥,⊤ ⊥<x<⊤⊥<x<⊤ x∈Sx∈S C′1:=C1∪{⊤}C′1:=C1∪{⊤} C′2:=C2∪{⊤}C′2:=C2∪{⊤}
Inisialisasi dan dan . Yang invarian adalah bahwa .C:=∅C:=∅ x:=⊥x:=⊥ y:=⊥y:=⊥ x≮y∧y≮xx≮y∧y≮x
Biarkan menjadi elemen selanjutnya dari , yaitu, . Mari menjadi elemen berikutnya dari , yaitu, .x′x′ C1C1 x′:=inf{z∣z∈C′1∧x<z}x′:=inf{z∣z∈C′1∧x<z} y′y′ C2C2 y′:=inf{w∣w∈C′2∧y<w}y′:=inf{w∣w∈C′2∧y<w}
Jika , set dan lanjutkan ke langkah 9.x′≮y′∧y′≮x′x′≮y′∧y′≮x′ (x,y):=(x′,y′)(x,y):=(x′,y′)
Jika , atur dan lanjutkan ke langkah 9.y<x′<y′y<x′<y′ (x,y):=(x′,x′)(x,y):=(x′,x′)
Jika , atur dan lanjutkan ke langkah 9. Perhatikan bahwa menyiratkan bahwa .y≮x′<y′y≮x′<y′ x:=x′x:=x′ x<x′∧x≮yx<x′∧x≮y x′≮yx′≮y
Jika , atur dan lanjutkan ke langkah 9.x<y′<x′x<y′<x′ (x,y):=(y′,y′)(x,y):=(y′,y′)
Jika , atur dan lanjutkan ke langkah 9. Perhatikan bahwa menyiratkan bahwa .x≮y′<x′x≮y′<x′ y:=y′y:=y′ y<y′∧y≮xy<y′∧y≮x y′≮xy′≮x
Langkah ini tidak pernah tercapai, karena kondisi untuk langkah 3–7 lengkap.
Jika (ekuivalen, ), atur dan lanjutkan ke langkah 2.x≠⊤x≠⊤ y≠⊤y≠⊤ C:=C∪{(x,y)}C:=C∪{(x,y)}
Program Dinamis. Untuk semua , hitung mana jika benar dan jika salah. Oleh Lemma 1, berarti ekspresi kurung menghitung dengan benar jumlah elemen baru. Oleh Lemma 2, solusi optimal untuk masalah asli ditemukan.(x,y)∈T(x,y)∈T D[x,y]:=sup({D[z,w]+[x≠z]+[y≠w]−[x=y]|(z,w)∈T∧(z,w)<(x,y)}∪{2−[x=y]}),
sumber
Biarkan untuk mengurutkan daftar poin.P=p1…pnP=p1…pn
Mengikuti pengulangan Anda untuk satu jalur, hal pertama yang perlu diperhatikan adalah bahwa Anda harus melacak titik mana yang telah dikunjungi oleh jalur; jika tidak, Anda tidak dapat menghitung dengan benar. Hal kedua adalah bahwa Anda sekarang memiliki empat kemungkinan untuk setiap titik: tidak ada jalur yang dapat menggunakannya, salah satunya atau keduanya. Jadi, kita harus menemukan kombinasi maksimal untuk ketiga kasus.
Secara formal, misalkan dengan sepasang (set) node yang dikunjungi dari keduanya jalur yang memaksimalkan jumlah poin dikunjungi dari input mengatur ke satu th, dengan komponen pertama pasangan memaksimalkan jalur yang yang pertama menggunakan , komponen yang sama kedua untuk jalur kedua dan ketiga komponen dengan kedua jalur menggunakan . diberikan oleh pengulangand:[0…n]→(2[n]×2[n])3d:[0…n]→(2[n]×2[n])3 d(i)d(i) ii pipi pipi dd
d(0)=((∅,∅),(∅,∅),(∅,∅))d(i)=( argmax(L,R)∈(L′×R)i|L∪R|,=( argmax(L,R)∈(L×R′)i|L∪R|,=( argmax(L,R)∈(L′×R′)i|L∪R| )d(0)d(i)=((∅,∅),(∅,∅),(∅,∅))=( argmax(L,R)∈(L′×R)i|L∪R|,=( argmax(L,R)∈(L×R′)i|L∪R|,=( argmax(L,R)∈(L′×R′)i|L∪R| )
dengan
(L′×R)i={(L∪{i},R)∣(L,R)∈i−1⋃j=0d(j),xi≥maxj∈Lxj,yi≥maxj∈Lyj}(L′×R)i={(L∪{i},R)∣(L,R)∈⋃j=0i−1d(j),xi≥maxj∈Lxj,yi≥maxj∈Lyj} ,
(L′×R)i(L′×R)i sama dengan memperluas dan sama dengan memperluas baik dan .RR (L′×R′)i(L′×R′)i LL RR
Tidak perlu dikatakan, ini tidak terlalu baik. Ini karena masalahnya tidak cocok untuk pemrograman dinamis dengan sangat baik: Anda tidak dapat menggabungkan banyak solusi parsial karena tidak ada pemesanan total yang bagus pada poin, dan Anda tidak dapat membuang hasil antara karena alasan yang sama.
Pandangan yang lebih baik tentang masalah ini adalah memodelkan set poin sebagai graf asiklik terarah tertimbang denganG=(V,E,w)G=(V,E,w)
Perhatikan bahwa Anda dapat menjaga grafik lebih kecil jika Anda menghapus tepi yang berlebihan, yaitu menghapus jika ada jalur , karena mengambil "pintasan" seperti itu tidak pernah lebih baik menguntungkan.(v1,v2)(v1,…,v2)
Untuk satu jalur, solusinya jelas panjang jalur terpanjang dari hingga . Sekarang, jika kita mengubah sehingga semua sisi yang mengarah ke titik pada juga memiliki bobot dan menghitung jalur terpanjang dalam grafik yang dimodifikasi ini, kita mendapatkan jalur sehingga dan bersama-sama menutupi sebagai poin sebanyak dua jalur bisa. Ini meninggalkan kita dengan runtime di (lihat di sini ).P∗(0,0)(X,Y)wP∗0P+P∗P+O(|V|+|E|)⊆O(n2)
sumber