1. 程式人生 > >【例題】【動規】最長上升子序列

【例題】【動規】最長上升子序列

最長上升子序列
有N個整數構成的序列,請找出其中長度最長的上升子序列的長度.

思路:
1、階段:從右到左依次討論每個數字。
2、狀態:f[i]表示從第i個數開始向右能夠得到的最長上升序列的長度。
3、決策:第i個數與它右側大於i的數中,f[]值最大那一個組合成上升序列。
4、方程:f[i]=1+max{ f[j] }
邊界條件:i < j <=n,且a[i]< a[j]

程式碼:

for(i=1;i<=n;i++)f[i]=1;   //初始化
for(i=n;i>=1;i--)  /*變式1:狀態為i開始向左時,for(i=1;i<=n;i++)          */
for(k=i+1;k<=n;k++) /* for(k=i-1;k>=1;k--) */ if(a[i]<a[k])&&(f[i]<1+f[k])f[i]=1+f[k]; /*變式: <= :不下降 > :下降 >= :不上升 */