HDU5087 Revenge of LIS II (LIS变形)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5087

题意:

求第二长的最长递增序列的长度

分析:

用step[i]表示以i结尾的最长上升序列的长度,dp[i]表示到i的不同的最长的子序列的个数

然后最后判断最长的子序列的个数是否大于1是的话输出Max,否则输出Max-1

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1005;
int step[maxn],dp[maxn], num[maxn];
int main ()
{
    int T;
    scanf("%d", &T);
    while(T--){
        int n;
        scanf("%d", &n);
        memset(dp, 0, sizeof(dp));
        memset(step, 0, sizeof(step));
        dp[0] = 1;
        for(int i = 1; i <= n; i++)
            scanf("%d", &num[i]);
        int Max = -1;
        for(int i = 1; i <= n; i++){
            for(int j = 0; j < i; j++){
                if(num[i] > num[j]){
                    if(step[j]+1 > step[i]){
                        step[i] = step[j] + 1;
                        dp[i] = dp[j];
                    }
                    else if(step[j] + 1 == step[i])
                        dp[i] += dp[j];
                }
            }
            Max = max(Max, step[i]);
        }
        int flag = 0;
        int ok = 1;
        for(int i = 1; i <= n; i++){
            if(step[i] == Max){
                if(dp[i] > 1) ok = 0;
                else{
                    if(flag) ok = 0;
                    flag = 1;
                }
            }
        }
        printf("%d\n", Max - ok );
    }
    return 0;
}
时间: 2024-10-13 16:05:40

HDU5087 Revenge of LIS II (LIS变形)的相关文章

hdu 5087 Revenge of LIS II lcs变形

点击打开链接链接 Revenge of LIS II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1028    Accepted Submission(s): 334 Problem Description In computer science, the longest increasing subsequence proble

hdu 5087 Revenge of LIS II(LIS)

题目连接:hdu 5087 Revenge of LIS II 题目大意:给定一个序列,求第2长的LIS长度. 解题思路:用o(n^2)的算法求LIS,每个位置维护两个值,最大和最小即可.注意的是dp[0]中的最大第二大不能都复制成0. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 1005; int N, A[maxn],

hdu 5087 Revenge of LIS II ( LIS ,第二长子序列)

链接:hdu 5087 题意:求第二大的最长升序子序列 分析:这里的第二大指的是,全部的递增子序列的长度(包含相等的), 从大到小排序后.排在第二的长度 BestCoder Round #16 上的第二题,注意  1 1 2 这组数据,答案应为2 思路1.每次将最长的两个上升子序列长度记录.最后再排序,取第二大的就可以 思路2.假设最长的上升子序列长度(ans)唯一,那第二大应为ans-1 否则,第二大的就为 ans [cpp] view plaincopyprint? #include<std

hdu5087——Revenge of LIS II

Revenge of LIS II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 444    Accepted Submission(s): 143 Problem Description In computer science, the longest increasing subsequence problem is to fi

HDU5087——Revenge of LIS II(BestCoder Round #16)

Revenge of LIS II Problem DescriptionIn computer science, the longest increasing subsequence problem is to find a subsequence of a given sequence in which the subsequence's elements are in sorted order, lowest to highest, and in which the subsequence

HDU 5087 Revenge of LIS II(次长上升子序列)

题意  求一个序列的所有上升子序列中第二长的那个的长度 简单的dp   d[i]表示以第i个数结尾的最长上升子序列的长度  c[i]表示到达d[i]的方法数  如序列1 1 2  d[3]=2,c[3]=2  因为选1 3位置和 2 3位置的都可以得到d[3]=2 递推过程很简单 d[i]=max{d[j]+1}其中a[i]>a[j]&&i>j 最后看d[1~n]中最大的数出现了几次  出现了不止一次就直接输出否则就减一输出咯 #include <cstdio> #

UVA10599 - Robots(II)(变形的LIS)

题意:一个机器人在n * m的网格里面捡垃圾,机器人只能向右或向下走,求出能捡到的垃圾数量的最大值,有多少条路径可以达到最大值,以及输出其中一条路径. 思路:按照题意可以看出,因为机器人只能向右和向下走,所以纵坐标就不重要的,而横坐标是递增的.当将所有拥有垃圾的格子经过计算得到它的一维值(唯一的),得到一组的数组.那就可以转化为求最长上升子序列.但这个LIS的条件是mod(m)要大于前一个.计算数量时,当d[i] = d[j] + 1时,就相当于以i为结束时的最长上升子序列比以j结束时的最长上升

HDOJ 5087 Revenge of LIS II DP

DP的时候记录下是否可以从两个位置转移过来.... Revenge of LIS II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 393    Accepted Submission(s): 116 Problem Description In computer science, the longest increasing su

hdoj 5087 Revenge of LIS II 【第二长单调递增子】

称号:hdoj 5087 Revenge of LIS II 题意:非常easy,给你一个序列,让你求第二长单调递增子序列. 分析:事实上非常easy.不知道比赛的时候为什么那么多了判掉了. 我们用O(n^2)的时间求单调递增子序列的时候,里面在加一层循环维护sum数组.表示前面有几个能够转移当当前,求前面sum的和保存到当前. 最后求最后一个sum[n-1]是否为1就ok.为1的话在最长的基础上减一,否则就是最长的. AC代码: #include <iostream> #include &l