dp[k] を、最後が木 k であるような増加部分列のうち最長であるものの長さとしてみましょう。dp[1] ~ dp[k-1] が求まっているとして、dp[k] とこれらの関係はどのようになっているかを考えてみましょう。
少し考えると、1以上 k 未満の i について a_i < a_k が成り立っているとき、最後が木 i であるような増加部分列の最後に木 k をくっつけることで、新しく長さ dp[i] + 1 の増加部分列を作れることがわかります。そして、最後が木 k であるような最長増加部分列は、このようにして作られる部分列のうち最長のものであることがわかります。
dp[1] <- 1
for i = 2 to n
dp[i] <- 1 // 木 i のみからなる部分列の長さ
for j = 1 to i-1
if a[j] < a[i] then
dp[i] <- max(dp[i], dp[j]+1) // 最後が木 j であるような増加部分列の末尾に木 i をくっつける
print max({dp[1], ... ,dp[n]})