解題報告:
思路:定義dp[i]爲num[i]結尾的最長上升子序列的長度,它可以由dp[1...j-1]轉移過來,當然要滿足num[i] > num[j],最後對dp數組求最大值,因爲最長上升子序可能出現在以任意num[i]結尾的序列中。
代碼:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const ll N = 1e3 + 10;
ll dp[N];
ll num[N];
ll n;
void solve(){
for(ll i=1; i<=n; ++i){
dp[i] = 1;
}
for(ll i=2; i<=n; ++i){
for(ll j=1; j<i; ++j){
if(num[i] > num[j]){
dp[i] = max(dp[j] + 1, dp[i]);
}
}
}
ll maxn = 0;
for(ll i=1; i<=n; ++i){
maxn = max(maxn, dp[i]);
}
printf("%lld\n", maxn);
}
int main(){
scanf("%lld", &n);
for(ll i=1; i<=n; ++i){
scanf("%lld", num + i);
}
solve();
return 0;
}