POJ 2355(LIS)

A - Longest Ordered Subsequence

Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

Submit Status Practice POJ 2533

Description

A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence ( a1a2, ..., aN) be any sequence (ai1ai2, ..., aiK), where 1 <= i1 < i2 < ... < iK <= N. For example, sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, e. g., (1, 7), (3, 4, 8) and many others. All longest ordered subsequences are of length 4, e. g., (1, 3, 5, 8).

Your program, when given the numeric sequence, must find the length of its longest ordered subsequence.

Input

The first line of input file contains the length of sequence N. The second line contains the elements of sequence - N integers in the range from 0 to 10000 each, separated by spaces. 1 <= N <= 1000

Output

Output file must contain a single integer - the length of the longest ordered subsequence of the given sequence.

Sample Input

7
1 7 3 5 9 4 8

Sample Output

4

题目大意:

  给你一个长度为n的字符串,让你求出这个串的最长的子序列。

解题思路:

  常见的dp题型:LIS

  定义状态:dp[i]表示以a[i]结尾的最长上升子序列的长度

  初始状态:dp[i] = 1

   状态转移方程:dp[i] = max(dp[i],dp[j]+1 );&&(j < i,a[j] <a[i] )的情况下。

代码:

 1 # include<cstdio>
 2 # include<iostream>
 3 # include<fstream>
 4 # include<algorithm>
 5 # include<functional>
 6 # include<cstring>
 7 # include<string>
 8 # include<cstdlib>
 9 # include<iomanip>
10 # include<numeric>
11 # include<cctype>
12 # include<cmath>
13 # include<ctime>
14 # include<queue>
15 # include<stack>
16 # include<list>
17 # include<set>
18 # include<map>
19
20 using namespace std;
21
22 const double PI=4.0*atan(1.0);
23
24 typedef long long LL;
25 typedef unsigned long long ULL;
26
27 # define inf 999999999
28 # define MAX 10000+4
29
30 int a[MAX];
31 int dp[MAX];
32
33
34 int main(void)
35 {
36     int n;
37     while ( scanf("%d",&n)!=EOF )
38     {
39         int res = -1;
40         for ( int i = 0;i < n;i++ )
41         {
42             scanf("%d",&a[i]);
43         }
44         for ( int i = 0;i < n;i++ )
45         {
46             dp[i] = 1;
47             for ( int j = 0;j < i;j++ )
48             {
49                 if ( a[j] < a[i] )
50                 {
51                     dp[i] = max(dp[i],dp[j]+1 );
52                 }
53             }
54             res = max(res,dp[i]);
55         }
56         printf("%d\n",res);
57     }
58
59
60     return 0;
61 }
时间: 2024-10-06 19:07:26

POJ 2355(LIS)的相关文章

POJ 2355 Railway tickets (线性dp)

OJ题目 :click here~ 题目分析:X为距离 , 当0<X<=L1, 票价为C1. L1<X<=L2 ,票价为C2.L2<X<=L3,票价为C3.给每段车站时间的距离,求某两个车站之间的总票价的最小值. 设dp[ i ] 为到车站 i 的最少票价 . 则转移方程为dp[ i ] = min(dp[ j ] + 从j 到 i 的票价),j 为所有可以直接到 i 的车站. 要注意第一个数字 大于 第二个数字的情况.的确,题目没有说,从a 到 b.只说了a,b之间.

POJ 2355 Find a multiple(组合数学-抽屉原理)

Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5881   Accepted: 2560   Special Judge Description The input contains N natural (i.e. positive integer) numbers ( N <= 10000 ). Each of that numbers is not greater than 15000

poj 2533 LIS

题目链接:http://poj.org/problem?id=2533 经典问题 最长上升子序列 <挑战程序设计竞赛>原题 #include <cstdio> #include <cstdlib> #include <ctime> #include <iostream> #include <cmath> #include <cstring> #include <algorithm> #include <s

poj 2533 LIS(最长上升序列)

***一道裸题, 思路:在g数组内往里加元素,一直扩大这个数组,每次查询的时候,用二分查找,时间复杂度O(nlog(n)) *** #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<cctype> #include<queue> #include<vector> #in

POJ 2533 Longest Ordered Subsequence(LIS模版题)

Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 47465   Accepted: 21120 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ...

十三 十四周总结

1 //十三周总结 2 //在看挑战程序设计的第二章和第三章的第一节 3 //二分 4 //1.从一个 有序的数组里面查找某一个值 5 int pos=lower_bound(a,a+n,key)-a;//返回的pos是大于等于键值的第一个位置 6 int pos=upper_bound(a,a+n,key)-a;//返回的pos是严格大于键值的第一 个位置 7 //2.判断一个解是否可行 8 //1)一般应该是先确定上界,下界,一个判断解是否可行的ok函数来找 9 //2) 看书上写的,输出小

SHUOJ A序列 &amp;&amp; POJ 1836 Alignment [动态规划 LIS]

A序列 发布时间: 2017年7月8日 21:16   最后更新: 2017年7月8日 22:29   时间限制: 1000ms   内存限制: 128M 描述 如果一个序列有奇数个正整数组成,不妨令此序列为a1,a2,a3,...,a2?k+1 (0<=k ),并且a1,a2...ak+1 是一个严格递增的序列,ak+1,ak+2,...,a2?k+1 ,是一个严格递减的序列,则称此序列是A序列. 比如1 2 5 4 3就是一个A序列. 现在Jazz有一个长度为n 的数组,他希望让你求出这个数

poj 3903 &amp; poj 2533 最长上升子序列(LIS)

最长上升子序列. 做这道题之前先做了2533,再看这道题,感觉两道题就一模一样,于是用2533的代码直接交, TLE了: 回头一看,数据范围.2533 N:0~1000:3903 N :1~100000. 原因终归于算法时间复杂度. 也借这道题学习了nlgn的最长上升子序列.(学习链接:http://blog.csdn.net/dangwenliang/article/details/5728363) 下面简单介绍n^2 和 nlgn 的两种算法. n^2: 主要思想:DP: 假设A1,A2..

POJ 1887 Testingthe CATCHER (LIS:最长下降子序列)

POJ 1887Testingthe CATCHER (LIS:最长下降子序列) http://poj.org/problem?id=3903 题意: 给你一个长度为n (n<=200000) 的数字序列, 要你求该序列中的最长(严格)下降子序列的长度. 分析:        读取全部输入, 将原始数组逆向, 然后求最长严格上升子序列就可以. 因为n的规模达到20W, 所以仅仅能用O(nlogn)的算法求.        令g[i]==x表示当前遍历到的长度为i的全部最长上升子序列中的最小序列末