分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击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 */