日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最长升序子串1231

發(fā)布時間:2024/7/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最长升序子串1231 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目與解析

給定n個數(shù)字,在這n個數(shù)字中找出最長上升子序列。
那么什么是上升子序列呢?
上升子序列就是在一個數(shù)列中遞增的部分,不一定是連續(xù)的,比如說

圖中的24678和24679都是數(shù)列24635798的上升子序列

解題思路

就按圖上2 4 6 3 5 7 9 8 這個數(shù)列來說:
我們定義dp[i]為以a[i]結(jié)尾的數(shù)列中的最長上升子序列的長度。

  • 前1個數(shù) 2前面沒有數(shù),所以dp(1) = 1 子序列為2。
  • 前2個數(shù) 4前面有2小于4,所以dp(2) = dp(1)+1 = 2 子序列為2 4。
  • 前3個數(shù) 6前面有2 4 小于6,所以dp(3) = dp(2)+1 = 3 子序列為2 4 6。
  • 前4個數(shù) 3前面有2 小于3,所以dp(4) = dp(1)+1 = 2 子序列為2 3。
  • 前5個數(shù) 5前面有2 4小于5,所以 dp(5) = dp(2)+1 = 3 子序列為2 4 5。
  • 前6個數(shù) 7前面有2 4 6小于7 ,所以dp(6) = dp(3)+1 = 4 子序列為2 4 6 7。
  • 前7個數(shù) 9前面有2 4 6 7小于9,所以dp(7) = dp(6)+1 = 5 子序列為2 4 6 7 9。
  • 前8個數(shù) 8前面有2 4 6 7小于8,所以dp(8) = dp(6)+1 = 5 子序列為2 4 6 7 9。
  • 在dp中找最大的就是最長上升子串的長度。
    這很明顯就是一個典型的動態(tài)規(guī)劃,,,,
  • 上代碼

    #include <iostream> #include <vector> #include <algorithm>using namespace std;int main() {int n;while (cin >> n){vector<int> x(n, 0);for (int i = 0; i < n; ++i){cin >> x[i];}vector<int> dp(n, 1);for (int i = 1; i < n; ++i){for (int j = 0; j < i; ++j){if (x[i] > x[j])dp[i] = max(dp[j] + 1, dp[i]);}}cout << *max_element(dp.begin(), dp.end()) << endl;}return 0; }

    總結(jié)

    以上是生活随笔為你收集整理的最长升序子串1231的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。