#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