POJ 2533(DP初步_C题)解题报告
题目链接:http://poj.org/problem?id=2533
--------------------------------------------------------
题意:最长上升子序列(LIS),问给出的序列中最长上升子序列的长度为多少。上升子序列:指i>j,a[i]>a[j]。
思路:f[i]表示以序列中第i个元素结尾的最长上升子序列的长度。状态转移方程为:if (a[i] > a[j]) f[i] = MAX (f[i], f[j] + 1);
代码:

#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int MAXN =1e3+10; int a[MAXN]; int f[MAXN]; int N; int cmp1(int a,int b){ return a>b; } int main(void){ scanf("%d",&N); for(int i=0;i<N;i++){ scanf("%d",&a[i]); } for(int i=0;i<N;i++){ f[i]=0; } f[0]=1; for(int i=1;i<N;i++){ int maxfj = 0; for(int j=0;j<i;j++){ if(a[j]<a[i]){ if(maxfj<f[j]){maxfj=f[j];} } f[i]=maxfj+1; } } sort(f,f+N,cmp1); printf("%d\n",f[0]); return 0; }