zoukankan      html  css  js  c++  java
  • CodeVS 1058 合唱队形(DP--最长子序列问题)

    题目大意:

    http://codevs.cn/problem/1058/

    求每一个点的之前的最长上升子序列和每一个点的之后的最长下降子序列。

    之前报错,因为需要将每一个dp的值赋值为1.

    代码:

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int arr[1000] = {0};
    int n;
    
    int main()
    {
        cin >> n;
        for(int i = 0; i < n; i++)
        {
            cin >> arr[i];
        }
    
        int dp[1000],dp1[1000];
        for(int i = 0; i < 1000; i++)
            dp[i] = dp1[i] = 1;
    
        for(int i = 1 ; i < n; i++)
        {
            for(int j = 0; j < i; j++)
            {
                if(arr[i] > arr[j])
                    dp[i] = max(dp[i],dp[j]+1);
            }
        }
    
        for(int i = n - 2 ; i >= 0; i--)
        {
            for(int j = i + 1; j < n; j++)
            {
                if(arr[i] > arr[j])
                    dp1[i] = max(dp1[i],dp1[j]+1);
            }
        }
    
        int max = 0;
        for(int i = 0; i < n; i++)
        {
            if(dp[i]+dp1[i]-1 > max)
                max = dp[i]+dp1[i]-1;
        }
    
        cout << n - max << endl;
    
        return 0;
    }
  • 相关阅读:
    java中的Class类
    装机
    CSS入门
    初级HTML
    IO加强
    Lambda表达式
    IOStream-基础
    JavaSE阶段基础内容(不包括I/O,常用类,集合)
    markdown学习
    Log4j配置详解
  • 原文地址:https://www.cnblogs.com/zyqBlog/p/7644237.html
Copyright © 2011-2022 走看看