#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