【動態規劃】之求最長上升子序列長度(難度:2星)

#include <stdio.h>

/**
 * 最長上升子序列問題
 * 原題:有一個數列,請求出這個數列中最長的上升子序列的長度。
 * 例如4,2,3,1,5的最長上升子序列是2,3,5。長度爲3
 */
#define MAX(x,y) (x>y?x:y)
#define N 10

static int a[N+1] = {9,1,5,3,6,8,7,2,1,10,11};

/**
 * 思路:
 * 設置子問題:求以a[i](其中i<=N)爲序列結尾的最長子序列長度maxLen
 * 確定邊界:顯然i=0,maxLen=1;
 */
//解法1:遞歸
int solve_1(int i){
    if (i == 0)
        return 1;
    if (a[i] > a[i-1])
        return 1 + solve_1(i-1);
    return solve_1(i-1);
}

//解法2:遞推
static int dp[N+1];
int solve_2(){
    int maxLen = 0;
    for (int i = 0; i <= N; ++i) {
        dp[i] = 1;
        for (int j = 0; j < i; ++j) {
            if (a[j] < a[i])
                dp[i] = MAX(dp[i], dp[j]+1);
        }
        maxLen = MAX(maxLen, dp[i]);
    }
    return maxLen;
}

int main() {
    printf("solve_1:%d\n", solve_1(N));
    printf("solve_2:%d\n", solve_2());
    return 0;
}

運行結果:

solve_1:6
solve_2:6




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章