先确定动态规划的状态,这个问题可以用序列某一项作为结尾来作为一个状态。用dp[i] 表示一定以第 i 项为结尾的最长上升子序列。用a[i]表示第 i 项的值,如果有j < i且a[j] < a[i],那么把第 i 项接在第 j 项后面构成的子序列长度为: dp[i] = dp[j] + 1。
要使dp[i]为以i结尾的最长.上升子序列,需要枚举所有满足条件的j。所以转移方程是:
dp[i] = max(dp[i], dp[j]+ 1) && j < i&&a[j]< a[i]
那么我们之前的例子根据转移方程则可以得到下表:
最后,dpdp 数组里面的最大值就是最长上升子序列的长度了。
主要代码:
int dp[MAX_N], a[MAX_N], n;
int ans = 0; // 保存最大值
for (int i = 1; i <= n; ++i) {
dp[i] = 1;
for (int j = 1; j < i; ++j) {
if (a[j] < a[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
ans = max(ans, dp[i]);
}
cout << ans << endl; // ans 就是最终结果