HOJ 10001 Longest Ordered Subsequence 解题报告

最长递增子序列

问题描述

     已知一个序列S:a[1],a[2],a[3],...,a[n-1],a[n]。定义序列Sub:a[r1],a[r2],...,a[rk]为S的子序列当且仅当满足:1<=r1<=r2<=...<=rk<=n。该问题要求求出序列S的最长递增子序列的长度。

问题分析

     最长递增子序列问题是动态规划的经典例题,其状态转移方程与很多看起来与该问题毫不相干的动态规划问题在是很相像的。对于最长递增子序列问题:定义f[i]表示序列前i个元素所组成的序列的最长递增子序列长度,则分析可以知道在前j(j<i)个元素中只要满足a[j]<a[i],f[i]的取值就可能为f[i]=f[j]+1,并且f[i]的最终取值为所有可能取值中的最大值。

     状态转移方程:f[i]=max{f[j]}+1,其中1<=j<i,a[j]<a[i];

     问题的解:cnt=max(f[1...n])。

#include<iostream> #include<cstdio> #define Max 1001 using namespace std; int f[Max],a[Max]; int main() { int n; while(scanf("%d",&n)!=-1) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { f[i]=1; for(int j=1;j<i;j++) if(a[j]<a[i] && f[i]<f[j]+1) f[i]=f[j]+1; } int cnt=0; for(int i=1;i<=n;i++) if(cnt<f[i]) cnt=f[i]; printf("%d/n",cnt); } return 0; }

你可能感兴趣的:(HOJ 10001 Longest Ordered Subsequence 解题报告)