Home Backend Development C++ How to use the longest increasing subsequence algorithm in C++

How to use the longest increasing subsequence algorithm in C++

Sep 19, 2023 pm 05:21 PM
c++ algorithm longest increasing subsequence

How to use the longest increasing subsequence algorithm in C++

How to use the Longest Increasing Subsequence algorithm in C requires specific code examples

The Longest Increasing Subsequence (LIS) is a classic Algorithmic problems, the solution ideas can be applied to many fields, such as data processing, graph theory, etc. In this article, I will introduce how to use the longest increasing subsequence algorithm in C and provide specific code examples.

First, let’s understand the definition of the longest increasing subsequence. Given a sequence a1, a2, …, an, we need to find a longest subsequence b1, b2, …, bm, in which the relative order of the elements of b in the original sequence is increasing. That is to say, for any i ai is satisfied, then bj > bi also exists in b. The length of the longest increasing subsequence is m.

Next, we will introduce two common algorithms for solving the longest increasing subsequence: dynamic programming algorithm and greedy algorithm.

  1. Dynamic programming algorithm

The dynamic programming algorithm divides the solution process of the longest increasing subsequence into multiple stages and stores the results in a two-dimensional array dp . dp[i] represents the length of the longest increasing subsequence ending with the i-th element in the sequence.

The specific solution process is as follows:

  • Initialize all elements of the dp array to 1, which means that the length of the subsequence ending with each element is at least 1.
  • Traverse the entire sequence from left to right, and for each position i, calculate the value of dp[i].
  • For each position i, traverse its previous position j. If aj

The final result is the maximum value in the dp array.

The following is a code example using C to implement the dynamic programming algorithm:

#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;
}
Copy after login
  1. Greedy algorithm

The greedy algorithm is a more efficient way to solve the longest problem Methods for Increasing Subsequence Problems. This algorithm uses an auxiliary array d to save the last element of the current longest increasing subsequence. Traverse the entire sequence, and for each element, use binary search to determine its position in the auxiliary array d.

The specific solution process is as follows:

  • Initialize the auxiliary array d as an empty array.
  • Traverse the entire sequence from left to right, for each element a, if a is greater than the end element of d, add a to the end of d.
  • If a is less than or equal to the last element of d, use binary search to find the first element in d that is greater than or equal to a, and replace it with a.

The final result is the length of the auxiliary array d.

The following is a code example for implementing the greedy algorithm in 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;
}
Copy after login

The above is an introduction and code example of how to use the longest increasing subsequence algorithm in C. Whether it is a dynamic programming algorithm or a greedy algorithm, it can solve the longest increasing subsequence problem with a time complexity of O(n^2) or O(nlogn). Readers can choose the appropriate algorithm to use based on specific application scenarios. I hope this article can help everyone understand the longest increasing subsequence algorithm.

The above is the detailed content of How to use the longest increasing subsequence algorithm in C++. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot Article Tags

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Improved detection algorithm: for target detection in high-resolution optical remote sensing images Improved detection algorithm: for target detection in high-resolution optical remote sensing images Jun 06, 2024 pm 12:33 PM

Improved detection algorithm: for target detection in high-resolution optical remote sensing images

Concurrency-safe design of data structures in C++ concurrent programming? Concurrency-safe design of data structures in C++ concurrent programming? Jun 05, 2024 am 11:00 AM

Concurrency-safe design of data structures in C++ concurrent programming?

C++ object layout is aligned with memory to optimize memory usage efficiency C++ object layout is aligned with memory to optimize memory usage efficiency Jun 05, 2024 pm 01:02 PM

C++ object layout is aligned with memory to optimize memory usage efficiency

Similarities and Differences between Golang and C++ Similarities and Differences between Golang and C++ Jun 05, 2024 pm 06:12 PM

Similarities and Differences between Golang and C++

How to implement the Strategy Design Pattern in C++? How to implement the Strategy Design Pattern in C++? Jun 06, 2024 pm 04:16 PM

How to implement the Strategy Design Pattern in C++?

How to implement a custom comparator in C++ STL? How to implement a custom comparator in C++ STL? Jun 05, 2024 am 11:50 AM

How to implement a custom comparator in C++ STL?

How to copy a C++ STL container? How to copy a C++ STL container? Jun 05, 2024 am 11:51 AM

How to copy a C++ STL container?

What are the underlying implementation principles of C++ smart pointers? What are the underlying implementation principles of C++ smart pointers? Jun 05, 2024 pm 01:17 PM

What are the underlying implementation principles of C++ smart pointers?

See all articles