原题;
题目描述
你的任务,就是对于给定的序列,求出最长上升子序列的长度。
输入
输出
示例输入
7 1 7 3 5 9 4 8
示例输出
4
分析:
dp第二弹~~~~~
源码1——dp
#include <iostream> using namespace std; int main() { int i,j,n,a[100],b[100],max; while(cin>>n) { for(i=0;i<n;i++) cin>>a[i]; b[0]=1; //初始化,以a[0]结尾的最长递增子序列长度为1 for(i=1;i<n;i++) { b[i]=1; //b[i]最小值为1 for(j=0;j<i;j++) if(a[i]>a[j]&&b[j]+1>b[i]) b[i]=b[j]+1; } for(max=i=0;i<n;i++)//求出整个数列的最长递增子序列的长度 if(b[i]>max) max=b[i]; cout<<max<<endl; } return 0; }
源码2:又称作LIS算法
#include<stdio.h> int z[1007],dp[1007]; int main() { int n,i,j; scanf("%d",&n); for(i=1; i<=n; i++) { scanf("%d",&z[i]); } dp[1]=z[1]; int left,right,lenth=1; for(j=2; j<=n; j++) { left=1; right=lenth; while(left<=right) { int mid=(left+right)/2; if(dp[mid]<z[j]) { left=mid+1; } else right=mid-1; } dp[left]=z[j]; if(left>lenth) lenth++; } printf("%d\n",lenth); return 0; }