Jumlah maksimum poin yang dapat dicapai oleh dua jalur

8

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.nnxxyy(xi,yi)(xi,yi)(xj,yj)(xj,yj)xixjxixjyiyjyiyjnn(0,0)(0,0)

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)(2,0),(2,1),(1,2),(0,3),(1,3),(2,3),(3,3),(2,4),(1,5),(1,6)88(0,0)(2,0)(2,1)(2,3)(2,4)(0,0)(2,0)(2,1)(2,3)(2,4)(0,0)(1,2)(1,3)(1,5)(1,6)(0,0)(1,2)(1,3)(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)O(n2)xi+yixi+yiD[i]D[i]11iiD[1]=1D[1]=1D[i]=max1j<i,xjxi,yjyiD[j]+1D[i]=max1j<i,xjxi,yjyiD[j]+1maks1sayanD[saya]+1max1inD[i]+1

Tapi saya tidak bisa menemukan hubungan berulang untuk dua jalur. Jika ada yang tahu tentang hubungan yang berulang seperti itu, saya akan senang mendengarnya.

Aden Dong
sumber
Saya akan mengurutkan poin secara leksikografis, tapi saya kira itu tidak masalah. Anda harus berlabuh di ; jalur terbaik mungkin tidak menggunakan koin pertama. Juga, cara Anda memilih hasilnya menunjukkan bahwa jalur terbaik harus menggunakan titik terakhir. Selain itu, karena struktur yang buruk, masalah ini tampaknya tidak cocok untuk DP. Menemukan jalur terpanjang di DAG yang ditunjukkan oleh poin akan jauh lebih masuk akal. D[0]D[0]
Raphael
Nah untuk satu jalur titik terakhir tidak perlu dimasukkan. Jika untuk beberapa titik tidak ada titik di sebelah kanan dan di atasnya maka hanya akan menjadi . Saya kira saya seharusnya membuatnya lebih jelas. iiD[i]D[i]11
Aden Dong
Bisakah Anda tidak hanya menjalankan algoritma dua kali, tetapi di pass kedua menghapus semua poin yang disentuh di jalur pertama? Atau apakah diperlukan suatu hubungan rekurensi tunggal?
edA-qa mort-ora-y

Jawaban:

4

Masalahnya, disajikan kembali dan digeneralisasi: diberi himpunan terbatas dilengkapi dengan perintah parsial , temukan rantai memaksimalkan . Pertanyaannya adalah tentang kasus di mana dan .SS C1,C2SC1,C2S|C1C2||C1C2|SR2+SR2+(x,y)(z,w)xzyw(x,y)(z,w)xzyw

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)),

((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)S2xyyx}T:={(x,y)(x,y)S2xyyx}

Lemma 1 (tanpa retacing). Biarkan menjadi sebuah rantai dan tentukan dan . Untuk semua , kita memiliki jika dan hanya jika .CTCTC1:={x(x,y)C}C1:={x(x,y)C}C2:={y(x,y)C}C2:={y(x,y)C}zSzSzC1C2zC1C2(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 .zC1C2zC1C2x,ySx,yS(x,z),(z,y)C(x,z),(z,y)CCC(x,z)(z,y)(z,y)(x,z)(x,z)(z,y)(z,y)(x,z)(x,z)(z,y)(x,z)(z,y)xzyxzyTTxzzyxzzyx=z=yx=z=y(z,z)C(z,z)C

Lemma 2 (keberadaan rantai terbaik terbatas). Untuk semua rantai , terdapat rantai sehingga dan .C1,C2SC1,C2SCTCTC1{x(x,y)C}C1C2C1{x(x,y)C}C1C2C2{y(x,y)C}C1C2C2{y(x,y)C}C1C2

Bukti (direvisi). Kami memberikan algoritma untuk membangun . Untuk kenyamanan, mendefinisikan penjaga sehingga untuk semua . Biarkan dan .CC,,<x<<x<xSxSC1:=C1{}C1:=C1{}C2:=C2{}C2:=C2{}

  1. Inisialisasi dan dan . Yang invarian adalah bahwa .C:=C:=x:=x:=y:=y:=xyyxxyyx

  2. Biarkan menjadi elemen selanjutnya dari , yaitu, . Mari menjadi elemen berikutnya dari , yaitu, .xxC1C1x:=inf{zzC1x<z}x:=inf{zzC1x<z}yyC2C2y:=inf{wwC2y<w}y:=inf{wwC2y<w}

  3. Jika , set dan lanjutkan ke langkah 9.xyyxxyyx(x,y):=(x,y)(x,y):=(x,y)

  4. Jika , atur dan lanjutkan ke langkah 9.y<x<yy<x<y(x,y):=(x,x)(x,y):=(x,x)

  5. Jika , atur dan lanjutkan ke langkah 9. Perhatikan bahwa menyiratkan bahwa .yx<yyx<yx:=xx:=xx<xxyx<xxyxyxy

  6. Jika , atur dan lanjutkan ke langkah 9.x<y<xx<y<x(x,y):=(y,y)(x,y):=(y,y)

  7. Jika , atur dan lanjutkan ke langkah 9. Perhatikan bahwa menyiratkan bahwa .xy<xxy<xy:=yy:=yy<yyxy<yyxyxyx

  8. Langkah ini tidak pernah tercapai, karena kondisi untuk langkah 3–7 lengkap.

  9. Jika (ekuivalen, ), atur dan lanjutkan ke langkah 2.xxyyC:=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)TD[x,y]:=sup({D[z,w]+[xz]+[yw][x=y]|(z,w)T(z,w)<(x,y)}{2[x=y]}),

D[x,y]:=sup({D[z,w]+[xz]+[yw][x=y](z,w)T(z,w)<(x,y)}{2[x=y]}),
[condition]=1[condition]=1conditioncondition[condition]=0[condition]=0conditioncondition
Herm
sumber
Bagus. Saya belum memeriksa setiap detail. Selamat datang di cs.SE!
Raphael
0

Biarkan untuk mengurutkan daftar poin.P=p1pnP=p1pn


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:[0n](2[n]×2[n])3d:[0n](2[n]×2[n])3d(i)d(i)iipipipipidd

d(0)=((,),(,),(,))d(i)=( argmax(L,R)(L×R)i|LR|,=( argmax(L,R)(L×R)i|LR|,=( argmax(L,R)(L×R)i|LR| )d(0)d(i)=((,),(,),(,))=( argmax(L,R)(L×R)i|LR|,argmax(L,R)(L×R)i|LR|,argmax(L,R)(L×R)i|LR| )

dengan

(L×R)i={(L{i},R)(L,R)i1j=0d(j),ximaxjLxj,yimaxjLyj}(L×R)i={(L{i},R)(L,R)j=0i1d(j),ximaxjLxj,yimaxjLyj} ,

(L×R)i(L×R)i sama dengan memperluas dan sama dengan memperluas baik dan .RR(L×R)i(L×R)iLLRR

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)

  • V={(0,0),p1,,pn,(X,Y)}V={(0,0),p1,,pn,(X,Y)} dengan , , danX=maxxiX=maxxiY=maxyi
  • E={((x1,y1),(x2,y2))V2xixj,yiyj} dan
  • w(v1,v2)={0,v2=(X,Y)1, else .

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)wP0P+PP+O(|V|+|E|)O(n2)

Raphael
sumber
Saya mungkin telah salah paham tentang apa yang Anda tulis, tetapi untuk grafik asiklik terarah tertimbang, apakah itu berarti kita cukup menemukan jalur terpanjang terlebih dahulu, lalu menghapus semua tepi di jalur terpanjang dan menemukan jalur terpanjang di grafik yang tersisa?
Aden Dong
@ AdenDong: Tidak, tidak menghapus; jalur kedua diizinkan untuk menggunakan kembali tepi yang diambil jalur pertama. Kami memberikan bobot kepada mereka sehingga node target mereka tidak dihitung lagi - bagaimanapun juga, kami ingin jalur kedua mengambil rute baru jika menguntungkan. 0
Raphael