NEFU OJ21最长上升子序列

来源:互联网 发布:淘宝打印电子面单 编辑:程序博客网 时间:2024/06/01 23:36

仍然用dp,因为最长上升字序列是最优问题,而且保证最优解由最优子解构成

数组为a[n],解为dp[n]

dp[i]表示以a[i]结尾的最长上升子序列长度

i的范围:[0-j),如果a[j] > a[i],则存在上升子序列dp[i] +1,求最长则得d[j]。

注意不一定dp[n-1]是最长的,所以还要求d[n]中最大值。

#include<iostream>  #include<stdio.h> using namespace std; int a[1000];int dp[1000];int main()  {  int n,max;while(scanf("%d",&n) != EOF && n!=0 ){max = 1;for(int i=0;i<n;++i){scanf("%d",&a[i]);}for(int i=0;i<n;++i){dp[i] = 1;}for(int i =1;i<n;++i){for(int j =0;j<i;++j){if(a[i] > a[j]){if(dp[i] < dp[j]+1){dp[i] = dp[j]+1;if(max < dp[i])max = dp[i];}}}}printf("%d\n",max);}    return 0;  }  


0 0
原创粉丝点击