1. 程式人生 > >dp-最長遞增子序列 (LIS)

dp-最長遞增子序列 (LIS)

一個數 bsp 註意 str 只有一個 自然 end alt ace

首先引出一個例子

問題 :

  給你一個長度為 6 的數組 , 數組元素為 { 1 ,4,5,6,2,3,8 } , 則其最長單調遞增子序列為 { 1 , 4 , 5 , 6 , 8 } , 並且長度為 5 。

分析 :

  題目所要找的遞增子序列 , 想想有什麽特點呢 ? 是不是會發現 所有的遞增序列 ,前一個數一定小於後一個數 ,並且如果給所有從小到大的數標號 , 會得到一串遞增的數 。

  既然是借助動態規劃分析問題 , 那麽當前的產生的結果 , 僅僅只與前一次狀態有關 ,一直推的話 , 那麽是不是就很自然地想到我最最簡單的問題就是當數組中的元素只有一個的時候 , 並且我還要在開一個數組 , 記錄所有元素的位置 。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std ;

#define Min(a,b) a>b?b:a
#define Max(a,b) a>b?a:b


int main ( ) {
    int arr[7] = { 1 , 4 , 5 , 6 , 2 , 3 , 8 } ;
    int pt[10] ;

    for ( int i = 0 ; i < 7 ; i++ )
        pt[i] = 1 ;
    for ( int i = 1 ; i < 7 ; i++ ) {
        for ( int j = 0 ; j < i ; j++ ) {
            if ( arr[i] > arr[j] && pt[j]+1 > pt[i] ) // 註意一定要是 pt[j]+1 > pt[i] 
                pt[i] = pt[j] + 1 ;
        }
    }
    int maxn = 0 ;
    for ( int i = 0 ; i < 7 ; i++ )
        maxn = max ( maxn , pt[i] ) ;

    cout << maxn << endl ;

    return 0 ;
}

順便給出 pt[ ] 數組中所存的數據

  技術分享

dp-最長遞增子序列 (LIS)