


Cara menggunakan algoritma urutan terpanjang yang meningkat dalam C++
Cara menggunakan algoritma Susunan Bertambah Terpanjang dalam C++ memerlukan contoh kod khusus
Susulan Bertambah Terpanjang (LIS) ialah masalah algoritma klasik, dan idea penyelesaiannya boleh digunakan pada berbilang Medan seperti pemprosesan data, teori graf , dsb. Dalam artikel ini, saya akan memperkenalkan cara menggunakan algoritma urutan terpanjang yang meningkat dalam C++ dan memberikan contoh kod khusus.
Pertama, mari kita fahami takrifan susulan yang paling lama meningkat. Diberi jujukan a1, a2, …, an, kita perlu mencari jujukan terpanjang b1, b2, …, bm, di mana susunan relatif unsur-unsur b dalam jujukan asal semakin meningkat. Maksudnya, untuk mana-mana i < j, jika aj > Panjang susulan bertambah terpanjang ialah m.
Seterusnya, kami akan memperkenalkan dua algoritma biasa untuk menyelesaikan urutan yang paling lama meningkat: algoritma pengaturcaraan dinamik dan algoritma tamak.
- Algoritma Pengaturcaraan Dinamik
Algoritma pengaturcaraan dinamik membahagikan proses penyelesaian bagi jujukan yang paling lama meningkat kepada berbilang peringkat dan menyimpan keputusan dalam dp tatasusunan dua dimensi. dp[i] mewakili panjang jujukan peningkatan terpanjang yang berakhir dengan unsur ke-i dalam jujukan.
Proses penyelesaian khusus adalah seperti berikut:
- Mulakan semua elemen tatasusunan dp kepada 1, yang bermaksud panjang urutan yang berakhir dengan setiap elemen ialah sekurang-kurangnya 1.
- Lintas keseluruhan jujukan dari kiri ke kanan, dan untuk setiap kedudukan i, hitung nilai dp[i].
- Untuk setiap kedudukan i, lalui kedudukan sebelumnya j Jika aj
Hasil akhir ialah nilai maksimum dalam tatasusunan dp.
Berikut ialah contoh kod untuk melaksanakan algoritma pengaturcaraan dinamik dalam C++:
#include<iostream> #include<vector> using namespace std; int longestIncreasingSubsequence(vector<int>& nums) { int n = nums.size(); vector<int> dp(n, 1); for (int i = 1; i < n; i++) { for (int j = 0; j < i; j++) { if (nums[j] < nums[i]) { dp[i] = max(dp[i], dp[j]+1); } } } int res = 0; for (int i = 0; i < n; i++) { res = max(res, dp[i]); } return res; } int main() { vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18}; int res = longestIncreasingSubsequence(nums); cout << "最长递增子序列的长度为:" << res << endl; return 0; }
- Algoritma tamak
Algoritma tamak ialah cara yang lebih cekap untuk menyelesaikan masalah susulan yang semakin lama semakin meningkat. Algoritma ini menggunakan tatasusunan tambahan d untuk menyimpan elemen terakhir bagi urutan terpanjang yang semakin meningkat semasa. Lintas keseluruhan jujukan, dan untuk setiap elemen, gunakan carian binari untuk menentukan kedudukannya dalam tatasusunan tambahan d.
Proses penyelesaian khusus adalah seperti berikut:
- Memulakan tatasusunan tambahan d sebagai tatasusunan kosong.
- Lintas keseluruhan jujukan dari kiri ke kanan, untuk setiap elemen a, jika a lebih besar daripada elemen akhir d, tambahkan a pada hujung d.
- Jika a kurang daripada atau sama dengan elemen terakhir d, gunakan carian binari untuk mencari elemen pertama dalam d yang lebih besar daripada atau sama dengan a, dan gantikan dengan a.
Hasil akhir ialah panjang tatasusunan tambahan d.
Berikut ialah contoh kod untuk melaksanakan algoritma tamak dalam C++:
#include<iostream> #include<vector> using namespace std; int longestIncreasingSubsequence(vector<int>& nums) { vector<int> d; for (auto num : nums) { int left = 0, right = d.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (d[mid] < num) { left = mid + 1; } else { right = mid - 1; } } if (left >= d.size()) { d.push_back(num); } else { d[left] = num; } } return d.size(); } int main() { vector<int> nums = {10, 9, 2, 5, 3, 7, 101, 18}; int res = longestIncreasingSubsequence(nums); cout << "最长递增子序列的长度为:" << res << endl; return 0; }
Di atas ialah pengenalan dan contoh kod tentang cara menggunakan algoritma urutan yang paling lama meningkat dalam C++. Sama ada algoritma pengaturcaraan dinamik atau algoritma tamak, ia boleh menyelesaikan masalah urutan terpanjang yang semakin meningkat dengan kerumitan masa O(n^2) atau O(nlogn). Pembaca boleh memilih algoritma yang sesuai untuk digunakan berdasarkan senario aplikasi tertentu. Saya harap artikel ini dapat membantu semua orang memahami algoritma urutan yang semakin lama semakin meningkat.
Atas ialah kandungan terperinci Cara menggunakan algoritma urutan terpanjang yang meningkat dalam C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Mengira kedengaran mudah, tetapi sangat sukar untuk dilaksanakan dalam amalan. Bayangkan anda diangkut ke hutan hujan tropika yang asli untuk menjalankan banci hidupan liar. Setiap kali anda melihat haiwan, ambil gambar. Kamera digital hanya merekodkan jumlah bilangan haiwan yang dijejaki, tetapi anda berminat dengan bilangan haiwan unik, tetapi tiada statistik. Jadi apakah cara terbaik untuk mengakses populasi haiwan yang unik ini? Pada ketika ini, anda mesti berkata, mula mengira sekarang dan akhirnya bandingkan setiap spesies baharu daripada foto ke senarai. Walau bagaimanapun, kaedah pengiraan biasa ini kadangkala tidak sesuai untuk jumlah maklumat sehingga berbilion-bilion penyertaan. Para saintis komputer dari Institut Statistik India, UNL, dan Universiti Nasional Singapura telah mencadangkan algoritma baharu - CVM. Ia boleh menganggarkan pengiraan item yang berbeza dalam senarai panjang.

Dalam C, jenis char digunakan dalam rentetan: 1. Simpan satu watak; 2. Gunakan array untuk mewakili rentetan dan berakhir dengan terminator null; 3. Beroperasi melalui fungsi operasi rentetan; 4. Baca atau output rentetan dari papan kekunci.

Punca dan penyelesaian untuk kesilapan Apabila menggunakan PECL untuk memasang sambungan dalam persekitaran Docker Apabila menggunakan persekitaran Docker, kami sering menemui beberapa sakit kepala ...

Pengiraan C35 pada dasarnya adalah matematik gabungan, yang mewakili bilangan kombinasi yang dipilih dari 3 dari 5 elemen. Formula pengiraan ialah C53 = 5! / (3! * 2!), Yang boleh dikira secara langsung oleh gelung untuk meningkatkan kecekapan dan mengelakkan limpahan. Di samping itu, memahami sifat kombinasi dan menguasai kaedah pengiraan yang cekap adalah penting untuk menyelesaikan banyak masalah dalam bidang statistik kebarangkalian, kriptografi, reka bentuk algoritma, dll.

Multithreading dalam bahasa dapat meningkatkan kecekapan program. Terdapat empat cara utama untuk melaksanakan multithreading dalam bahasa C: Buat proses bebas: Buat pelbagai proses berjalan secara bebas, setiap proses mempunyai ruang ingatan sendiri. Pseudo-Multithreading: Buat pelbagai aliran pelaksanaan dalam proses yang berkongsi ruang memori yang sama dan laksanakan secara bergantian. Perpustakaan multi-threaded: Gunakan perpustakaan berbilang threaded seperti PTHREADS untuk membuat dan mengurus benang, menyediakan fungsi operasi benang yang kaya. Coroutine: Pelaksanaan pelbagai threaded ringan yang membahagikan tugas menjadi subtask kecil dan melaksanakannya pada gilirannya.

STD :: Unik menghilangkan elemen pendua bersebelahan di dalam bekas dan menggerakkannya ke akhir, mengembalikan iterator yang menunjuk ke elemen pendua pertama. STD :: Jarak mengira jarak antara dua iterators, iaitu bilangan elemen yang mereka maksudkan. Kedua -dua fungsi ini berguna untuk mengoptimumkan kod dan meningkatkan kecekapan, tetapi terdapat juga beberapa perangkap yang perlu diberi perhatian, seperti: STD :: Unik hanya berkaitan dengan unsur -unsur pendua yang bersebelahan. STD :: Jarak kurang cekap apabila berurusan dengan Iterator Akses Bukan Rawak. Dengan menguasai ciri -ciri dan amalan terbaik ini, anda boleh menggunakan sepenuhnya kuasa kedua -dua fungsi ini.

Fungsi Release_semaphore dalam C digunakan untuk melepaskan semaphore yang diperoleh supaya benang atau proses lain dapat mengakses sumber yang dikongsi. Ia meningkatkan kiraan semaphore dengan 1, yang membolehkan benang menyekat untuk meneruskan pelaksanaan.

Dalam bahasa C, nomenclature ular adalah konvensyen gaya pengekodan, yang menggunakan garis bawah untuk menyambungkan beberapa perkataan untuk membentuk nama pembolehubah atau nama fungsi untuk meningkatkan kebolehbacaan. Walaupun ia tidak akan menjejaskan kompilasi dan operasi, penamaan panjang, isu sokongan IDE, dan bagasi sejarah perlu dipertimbangkan.
