分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net
/*
* 问题:求解最长递增子序列。
*
* 分析:
* 方法:动态规划。
* 设计状态:记f(i)为以a[i]结尾的LIS长度,那么LIS=max{f(i)}。
* 推导:考虑比i小的每一个j,如果a[i]>a[j],那么f(i)=f(j)+1。
* 状态转移方程:f(i)=max{f(j)}+1;其中当i>j时,a[i]>a[j]。
*
* LongestIncreasingSubsequence.cpp - by LiveEveryDay
*/
#include <algorithm>
using namespace std;
int LIS(const int a[], int n) {
int dp[n];
int nMax = 1;
for (int i = 0; i < n; i++) {
dp[i] = 1;
for (int j = 0; j < i; j++) {
if (a[i] > a[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
if (dp[i] > nMax) {
nMax = dp[i];
}
}
return nMax;
}
int main() {
int a1[] = {1, -1, 2, -3, 4, -5, 6, -7};
printf("%d\n", LIS(a1, 8));
int a2[] = {1, 4, 3, 2, 6, 5};
printf("%d\n", LIS(a2, 6));
}
// ------ Output ------
/*
4
3
*/