Bagaimana cara mendeteksi susunan tumpukan?

8

Kami mengambil urutan bilangan bulat dari 1 untuk n, dan kami mendorong mereka ke tumpukan satu per satu secara berurutan. Di antara setiap dorongan, kita dapat memilih untuk mengeluarkan sejumlah item dari tumpukan (dari 0 hingga ukuran tumpukan saat ini).

Setiap kali kami mengeluarkan nilai dari tumpukan, kami akan mencetaknya.

Sebagai contoh, 1,2,3dicetak ketika kita melakukannya push, pop, push, pop, push, pop.3,2,1berasal dari push, push, push, pop, pop, pop.

Namun, 3,1,2 bukan hasil cetakan, karena tidak mungkin dimiliki 3 dicetak diikuti oleh 1, tanpa melihat 2 diantara.

Pertanyaan: Bagaimana kami bisa mendeteksi perintah yang mustahil3,1,2?

Bahkan, berdasarkan pengamatan saya, saya telah keluar solusi potensial. Tetapi masalahnya adalah saya tidak bisa membuktikan bahwa pengamatan saya lengkap.

Program yang saya tulis dengan logika berikut:

Ketika nilai saat ini dikurangi nilai berikutnya lebih besar dari 1, nilai antara saat ini dan berikutnya tidak dapat muncul setelah berikutnya. Misalnya, jika saat ini = 3 dan berikutnya = 1, maka nilai antara saat ini (3) dan berikutnya (1) adalah 2 yang tidak dapat muncul setelah berikutnya (1), maka3,1,2 melanggar aturan.

Apakah ini mencakup semua kasus?

Abadi
sumber

Jawaban:

6

Saya tidak dapat memahami pendekatan Anda dengan tepat (Tampaknya itu benar), tetapi ada aturan sederhana untuk pesanan yang tidak mungkin: Pesanan tidak mungkin iff ada ai,aj,ak seperti yang ai>ak>aj dan i<j<k. Untuk aai,aj,ak kami katakan triple bad.

Mengapa? Pertama, Anda harus membuktikan bahwa jika ada triple bad maka urutannya tidak mungkin, tetapi ini sederhana dan saya akan membiarkannya sebagai latihan (angka tengah tidak bisa muncul lebih cepat daripada lebih besar kecuali yang lebih kecil muncul sebelum mereka semua).

Kedua Anda harus membuktikan bahwa semua pesanan tidak mungkin memiliki setidaknya satu triple buruk, Asumsikan Anda memiliki urutan tanpa triple buruk, Anda dapat menemukan urutan push dan pop sehingga itu bukan urutan yang mustahil. Untuk merekonstruksi perintah push dan pop cukup gunakan pendekatan naif (operasi pop saat Anda mengulangi angka berurutan), tetapi untuk bukti formal (untuk kesederhanaan) Anda dapat menggunakan induksi, asumsikan untuk semua urutan panjangmjika tidak ada triple bad mereka tidak mungkin. Untuk urutan panjangn, Anda dapat mengatur operasi sebagai pop (mulai dari akhir urutan), saat bertemu dengan peningkatan angka berturut-turut, sekarang Anda memiliki urutan panjang m, dengan m<n, tanpa triple bad, sehingga Anda dapat merekonstruksi push dan pop untuk urutan ini, jadi yang asli tidak mustahil. mulai dari induksi adalah urutan panjang 3.


sumber