二分 连续上升子序列变形 UVA1471

最大上升子序列解法:

1.动规转移方程

2.(nlogn)

#include<cstdio>
#include<algorithm>
using namespace std;
const int INF=1<<30;
int a[1010];
int f[1010];
int main() {
    int n;
    while(~scanf("%d",&n)) {
        for(int i=0;i<n;i++) scanf("%d",&a[i]);
        for(int i=0;i<n;i++) f[i]=INF;
        for(int i=0;i<n;i++) {
            int t=lower_bound(f,f+n,a[i])-f;
            f[t]=a[i];
        }
        printf("%d\n",lower_bound(f,f+n,INF)-f);
    }
    return 0;
} 

时间: 2024-08-06 04:32:43

二分 连续上升子序列变形 UVA1471的相关文章

51nod1241(连续上升子序列)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1241 题意:中文题诶- 思路:通过观察我们不难发现就是找连续上升子序列,答案就是n-最长连续上升子序列长度: 注意:我们要找的是3, 4, 5, 6这样的连续上升子序列,而非1, 3, 5, 9 这样的上升子序列,因为两个连续的数之间如果有其他数我们可以直接移除,但是如果不连续的话我们无法直接加进去... 代码: 1 #include <iostream>

HDU 1160 FatMouse&#39;s Speed 动态规划 记录路径的最长上升子序列变形

题目大意:输入数据直到文件结束,每行两个数据 体重M 和 速度V,将其排列得到一个序列,要求为:体重越大 速度越低(相等则不符合条件).求这种序列最长的长度,并输出路径.答案不唯一,输出任意一种就好了. 题目思路:这是个最长上升子序列的问题,我们按W的升序进行排序,若W相等则按V的降序排序.用Pre[]记录当前点的前驱节点,Last记录序列最后一个点,maxn记录最长长度,完成动规后可根据Last和Pre[]输出路径. #include<cstdio> #include<stdio.h&

任意区间的最长连续递增子序列,最大连续子序列和

hdu3308 给n个数,有m个操作 U a b 表示将第a个数改成b Q a b 表示询问区间[a,b]的最长连续递增子序列. 区间询问问题且带修改,一般是用线段树来解决 那么要维护 Llen[rt], Lval[rt][2] 表示rt所对应的区间[l,r] 以l开头的最长连续递增子序列的长度, Lval[rt][0]表示子序列的最左边的值,Lval[rt][1]表示子序列最右边的值 Rlen[rt],Rval[rt][2]  表示rt所对应的区间[l,r]以r结尾的最长连续递增子序列的长度,

最长非连续递减子序列长度&amp;个数

1 int a[100] = {68, 69, 54, 64, 68, 64, 70, 67, 78, 62, 98, 87}; //主序列; 2 int n = 1; //主序列元素个数; 3 int large = 1; //最长非连续递减子序列序列长度; 4 int num = 1; //最长非连续递减子序列序列数量; 5 int fun(int i, int n, int cnt) // i开始下标; n结束下标; cnt已找到递减序列长度; 6 { 7 if(i == n) 8 ret

lintcode 中等题 :Maximum Product Subarray 最大连续乘积子序列

题目 乘积最大子序列 找出一个序列中乘积最大的连续子序列(至少包含一个数). 样例 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6. 解题  法一:直接暴力求解 时间复杂度O(N2) public class Solution { /** * @param nums: an array of integers * @return: an integer */ public int maxProduct(int[] nums) { // write your c

POJ 3616 Milking Time(最大递增子序列变形)

题目链接:http://poj.org/problem?id=3616 题目大意:给你时间N,还有M个区间每个区间a[i]都有开始时间.结束时间.生产效率(时间都不超过N),只能在给出的时间段内生产,要求合理安排时间求出最大生产价值. 解题思路:把区间按开始时间排序,于是有状态转移方程:dp[i]=max(dp[i],dp[j]+a[i].val)(前提是a[j].end+r<=a[i].start,i是区间的序号,j是i前面的区间) 相当于最大递增子序列的变形,写法差不多. 代码: 1 #in

LeetCode -- 最大连续乘积子序列

问题描写叙述: 给定数组,找出连续乘积最大值的子序列.比如 0,-1,-3.-2.则最大连续乘积为6= (-3) * (-2) 实现思路此题与最大连续和的子序列问题相似,也可通过找到递推公式然后用DP来解.关键在于求公式的过程要考虑到元素可能为负的情况.如果元素都为正数的话,DP公式为:dp[i] = max(a[i],dp[i-1]*a[i]) ,乘或不乘,取最大的那个可元素可能为负数.因此能够使用min和max分别存当前最大值和最小值,如果当前元素为负数的话,当前最小值就成了最大值.这样一来

Maximum Product Subarray(最大连续乘积子序列)

Find the contiguous subarray within an array (containing at least one number) which has the largest product. For example, given the array [2,3,-2,4],the contiguous subarray [2,3] has the largest product = 6. 思路:类似最大和连续子序列那样,不过除了记录最大乘积,我们还要记录最小的乘积.这里我

【两段连续不重合子序列和最大】 动态规划

最大子序列 TimeLimit: 1 Second MemoryLimit: 32 Megabyte Totalsubmit: 156 Accepted: 42 Description 给定一个N个整数组成的序列,整数有正有负,找出两段不重叠的连续子序列,使得它们中整数的和最大.两段子序列都可以为空. Input 多组输入,每组第一行为N,表示序列的长度:第二行为N个整数,表示输入序列.0<N<=1,000,000 Output 对于每组输入,输出一行,仅一个整数,表示最大的和. Sample