zoukankan      html  css  js  c++  java
  • P1091 合唱队形

    题意:有n名学生在成一排。然后为了站成中间高两边矮的合唱队列,问最少 不要几个人?

    思路:

    就是最长上升子序列裸用。当然是先把顺方向和逆方向的最长上升子序列找到。

    然后再枚举从哪里分,顺方向和逆方向的最长上升子序列的长度之和最长。

    其实蛮简单

    代码如下:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n, num[105];
    int dp[2][105];
    int main()
    {
        cin >> n;
        for (int i = 1; i <= n; i++)
            cin >> num[i];
        for (int i = 1; i <= n; i++)
        for (int i = 1; i <= n;++i)
        for (int j = 0; j < i; ++j)if (num[i] > num[j]) dp[0][i] = max(dp[0][i], dp[0][j] + 1);
        //j从0开始,就不用开始给dp赋值为1
        for (int i = n; i >= 1;--i)
        for (int j = n + 1; j > i; --j)if (num[i] > num[j])dp[1][i] = max(dp[1][i], dp[1][j] + 1);
        
        int ans = 0;
        for (int i = 1; i <= n; ++i)
            ans = max(dp[0][i] + dp[1][i] - 1, ans);
        cout << n - ans << endl;
    }
  • 相关阅读:
    高效是如何来的
    find 删除指定日期的文件
    MySQL基础教程
    grep search information
    关于进程的问题
    linux useradd 命令
    host and ip 的关系
    git cherry-pick 教程
    正则练习
    正则表达式-获取
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/9489789.html
Copyright © 2011-2022 走看看