此题显然要比超级楼梯,数字三角等题难一些。
思路:
将元素储存在a[ n ]数组中
将dp[ i ]代表每个元素所能构成最长子序列的长度
用倒推的思想来看,第n个元素的dp[ n ]等于小于a[ n ]的所有元素a[ x ]对应的dp[ x ]中的最大值+1。
DP状态转移方程:dp[ i ] = max ( dp[x] ) +1 (a[ x ] < a[ i ])
#include<iostream>
#define maxsize 1000
int* dp;
using namespace std;
int solve(int n);
int main() {
int n;
cin >> n;
dp = new int[n + 1];
memset(dp, 0, sizeof(dp));
cout << solve(n)<<endl;
//printf("%d\n", solve(n));
return 0;
}
int solve(int n) {
int* a;
a = new int[n + 1];
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
dp[1] = 1;
int m=0;
for (int i = 2; i <= n; i++) {
int x=0;
for (int j = 1; j < i; j++) { /*找出最大的上一个dp值*/
if (a[j] < a[i]) {
if (dp[j] > x) {
x = dp[j];
}
}
}
dp[i] = x + 1; /*计算dp[i]的值*/
if (dp[i] > m) { /*找出最大的dp[x]*/
m = dp[i];
}
}
return m;
}