题目链接:
代码如下:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 5050;int n;
int arr[N];
int dp[N]; //dp数组signed main(){cin >> n;for(int i = 1; i <= n; i++) cin >> arr[i];for(int i = 1; i <= n; i++){//对dp数组初始化 每个数字都是长度为1的序列dp[i] = 1;for(int j = 1; j<i; j++){//满足上升条件if(arr[j] < arr[i]){//题目要求最长 因此max取最长dp[i] = max(dp[i], dp[j]+1);}}}int ans = 0;for(int i = 1; i <= n; i++) ans = max(ans, dp[i]);cout << ans << endl;return 0;
}
注:
dp[i] = max(dp[i], dp[j]+1);
为什么要和dp[i]比较? 因为j是从1枚举到i-1的,因此,如果其中arr[j]符合,那么dp[i]就被赋值为dp[j]+1了,但是题目要求我们求得是最长的上升子序列。因此,我们要从dp[i],dp[j]+1 之中取最大值。