美文网首页
算法做题-动态规划

算法做题-动态规划

作者: 7cdaccb1777a | 来源:发表于2023-01-12 20:26 被阅读0次

合唱队(动态规划)

描述:

N 位同学站成一排,音乐老师要请最少的同学出列,使得剩下的 K 位同学排成合唱队形。

设KK位同学从左到右依次编号为 1,2…,K ,他们的身高分别为T_1,T_2,…,T_KT1,T2,…,TK ,若存在i(1\leq i\leq K)i(1≤i≤K) 使得T_1T_{i+1}>......>T_KTi>Ti+1>......>TK,则称这KK名同学排成了合唱队形。

通俗来说,能找到一个同学,他的两边的同学身高都依次严格降低的队形就是合唱队形。

例子:

123 124 125 123 121 是一个合唱队形

123 123 124 122不是合唱队形,因为前两名同学身高相等,不符合要求

123 122 121 122不是合唱队形,因为找不到一个同学,他的两侧同学身高递减。

你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

注意:不允许改变队列元素的先后顺序  不要求最高同学左右人数必须相等

数据范围: 1 \le n \le 3000 \1≤n≤3000 

题解:

思路,采用的是对态规划的办法,求左边最长递增子序列和右边最长递减子序列,

父问题递归成子问题,最小子问题解是1,反递归回去可得父问题解

import java.util.Scanner;

import java.util.*;

public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        int count = in.nextInt();

        int[] array = new int[count];

        int i = 0;

        while (i < count) {

            array[i] = in.nextInt();

            i++;

        }

        int[] arrayLeft = new int[count];

        int[] arrayRight = new int[count];

        Arrays.fill(arrayLeft, 1);

        Arrays.fill(arrayRight, 1);

          // 最长递增子序列

        for (i = 0 ; i < count; i++) {

            for (int j = 0 ; j < i; j++) {

                if (array[i] > array[j]) {

                    arrayLeft[i] = Math.max(arrayLeft[i], arrayLeft[j] + 1);

                }

            }

        }

        //最长递减子序列,此处的遍历应该从右到左了,或者从左到右 array[i] < array[j]

        for (i = count-1  ; i >= 0; i--) {

            for (int j = count - 1 ; j >= i; j--) {

                if (array[i] > array[j]) {

                    arrayRight[i] = Math.max(arrayRight[i], arrayRight[j] + 1);

                }

            }

        }

        int result = 0;

        for (i = 0 ; i < count ; i ++ ) {

            if (result < arrayLeft[i] + arrayRight[i] - 1) {

                result = arrayLeft[i] + arrayRight[i] - 1;

            }

        }

        System.out.print(count - result + "");

    }

}

相关文章

  • 4. 动态规划算法

    1. 动态规划算法总结2. 漫画:什么是动态规划?3.算法之动态规划4. 动态规划-算法

  • Swift 算法实战:动态规划

    Swift 算法实战:动态规划 Swift 算法实战:动态规划

  • 程序员算法基础——动态规划

    程序员算法基础——动态规划 程序员算法基础——动态规划

  • 动态规划

    --tags: 算法,动态规划 动态规划解题 引入:动态规划 和贪心法 都是算法的思想方法 贪心算法——像 第一类...

  • 动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 算法分类总结动态规划与静态规划的关系浅析静态规划和动态规划动态规划解非线性规...

  • 动态规划-js

    动态规划 参考:算法分析与设计-贪心&动归 漫画:什么是动态规划? 【数据结构与算法】 DP 动态规划 介绍 介绍...

  • 动态规划

    动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...

  • 2018-11-14

    今天学了动态规划一些知识,着重看了一下动态规划之背包算法(主要是0-1算法和部分算法),关于动态规划的问题重点是建...

  • 动态规划

    算法-动态规划 Dynamic Programming

  • 最短路径解决方法

    Floyd算法;Dijkstra算法;Bellman-Ford算法;动态规划算法

网友评论

      本文标题:算法做题-动态规划

      本文链接:https://www.haomeiwen.com/subject/fnprzctx.html