最长递增子序列 dp

/*
    Name:
    Copyright:
    Author:  流照君
    Date: data
    Description:
*/
#include <iostream>
#include<string>
#include <algorithm>
#include <vector>
#define inf 0x3f3f
using namespace std;
typedef long long ll;
int main()
{
	//freopen("in.txt", "r", stdin);
	int n,a[inf],dp[inf];
	fill(dp,dp+inf,0);
	cin>>n;
	for(int i=0;i<n;i++)
	cin>>a[i];
	dp[0]=1;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<i;j++)
		{
			if(a[i]>=a[j])
			{
				dp[i]=max(dp[i],dp[j]+1);
			}
		}
	}
	ll maxx=1;
	for(int i=0;i<n;i++)
	{
		if(dp[i]>maxx)
		maxx=dp[i];
	}
	cout<<maxx<<endl;
    //freopen("out.txt", "w", stdout);
    return 0;
}

  思想

好久没写题目了,惭愧

原文地址:https://www.cnblogs.com/liuzhaojun/p/12055263.html

时间: 2024-08-03 05:10:51

最长递增子序列 dp的相关文章

Bridging signals POJ 1631(最长递增子序列dp)

原题 题目链接 题目分析 由题目知,如果能求出连接点的最长递增子序列,则可以把连接不在该序列中的点的线全部剪掉.而维护最长递增子序列可以用dp来做,考虑到相同长度的递增子序列末尾数字越小越好,可以这样定义dp,dp[i]长度为i的递增子序列的最小末尾值,初始化为INF,由于这个dp具有有序性,因此可以用二分来加快更新,每次遍历到值num[i],只需二分找出大于等于num[i]的更新之即可.最后从扫一遍dp数组即可得到最长长度. 代码 1 #include <iostream> 2 #inclu

UVa 10534 Wavio Sequence (最长递增子序列 DP 二分)

Wavio Sequence  Wavio is a sequence of integers. It has some interesting properties. ·  Wavio is of odd length i.e. L = 2*n + 1. ·  The first (n+1) integers of Wavio sequence makes a strictly increasing sequence. ·  The last (n+1) integers of Wavio s

动态规划(DP),最长递增子序列(LIS)

题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(dp[k])+1,(k<i),(a[k]<a[i]) #include <stdio.h> #define MAX 1005 int a[MAX];///存数据 int dp[MAX];///dp[i]表示以a[i]为结尾的最长递增子序列(LIS)的长度 int main() { int

Redraiment的走法(最长递增子序列问题的求解--dp问题)

输入描述: 输入多行,先输入数组的个数,再输入相应个数的整数 输出描述: 输出结果 输入例子: 6 2 5 1 5 4 5 输出例子: 3 提示 Example: 6个点的高度各为 2 5 1 5 4 5 如从第1格开始走,最多为3步, 2 4 5 从第2格开始走,最多只有1步,5 而从第3格开始走最多有3步,1 4 5 从第5格开始走最多有2步,4 5 所以这个结果是3. //最长递增子序列问题--动态规划问题 1 import java.util.*; 2 public class Test

POJ 2533 Longest Ordered Subsequence【最长递增子序列】【DP思想】

Longest Ordered Subsequence Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submission(s) : 6   Accepted Submission(s) : 1 Problem Description A numeric sequence of ai is ordered ifa1 < a2 < ... < aN. Let t

HDU 3998 Sequence (最长递增子序列+最大流SAP,拆点法)经典

Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1666    Accepted Submission(s): 614 Problem Description There is a sequence X (i.e. x[1], x[2], ..., x[n]). We define increasing subsequ

[网络流24题]最长递增子序列问题

题目大意:给定长度为n的序列a,求:1.最长递增子序列长度:2.最多选出几个不相交的最长递增子序列:3.最多选出几种在除了第1个和第n个以外的地方不相交的最长递增子序列.(n<=1000) 思路:先倒着DP,求出f[i]表示以a[i]开头的最长的递增子序列长度,然后建图,若f[i]=最长递增子序列长度则S向i连1,若f[i]=1则i向T连1,若i<j且a[i]<a[j]且f[i]=f[j]+1则i向j连1,为保证每个点只被流一次,拆成入点和出点,流量限制1,跑最大流即可解决第二问,点1和

hdu1087最长递增子序列

原题地址 简单dp题,LIS.不同之处是这里要求得的不是最长的子序列,而是权重和最长的子序列.其实大同小异. 状态数组就是到达每个位置的最大权重. LIS问题常用解法就是两个: 人人为我 我为人人 本题我用了我为人人的思路 .就是确定子序列起点,把其后面每一个大于它的值的位置的状态数组更新. #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using name

【网络流24题】最长递增子序列

Description 给定正整数序列x1,..., xn. (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允许在取出的序列中多次使用x1和xn,则从给定序列中最多可取出多少个长度为s的递增子序列. 设计有效算法完成(1)(2)(3)提出的计算任务 Input 第1 行有1个正整数n(n<=500),表示给定序列的长度. 接下来的1 行有n个正整数x1,..., xn. Output 第1 行是最长递增子序列的长度s. 第2行是可