Misil interceptor con el modelo de subsecuencia ascendente más largo

Temas relacionados :

Subsecuencia ascendente más larga

Ala delta de Kaito Kidd

Ciudad hermana

Alpinismo

Descripción del Título

Cierto país desarrolló un sistema de interceptación de misiles para defenderse de los ataques con misiles de un país enemigo.

Sin embargo, este sistema de interceptación de misiles tiene un defecto: aunque su primer proyectil puede alcanzar cualquier altura, cada proyectil posterior no puede ser más alto que el anterior.

Un día, el radar captó un ataque con misiles enemigos. Dado que el sistema aún se encuentra en la fase de prueba, solo hay un sistema, por lo que es posible que no pueda interceptar todos los misiles.

Ingrese la altitud de los misiles a su vez (los datos de altitud dados por el radar son un número entero positivo no mayor de 30,000 y el número de misiles no excede 1,000), calcule el número máximo de misiles que este sistema puede interceptar y cuántos conjuntos de misiles deben estar equipados para interceptar todos los misiles. Un sistema de interceptación de misiles.

Formato de entrada

En una fila, ingrese la altitud de los misiles por turno.

Formato de salida

La primera línea contiene un número entero que indica el número máximo de misiles que se pueden interceptar.

La segunda línea contiene un número entero que indica el número mínimo de sistemas que se deben equipar para interceptar todos los misiles.

Muestra de entrada:

389 207 155 300 299 170 158 65

Salida de muestra:

6
2

Ideas:

1.第一问很简单就是求最长下降子序列;
2.第二问乍一看没想出来,按照不会就模拟的想法我们可以举几个例子来
看看规律,来猜做法;
例1.207 155207<155可以构成一个下降子序列,因此只需要一台机器;
例2.207 155 300207<155可以构成一个下降子序列,但300>207,无法同一
				一个降序列中,因此需要两个;
例3.155 300 311 299 170155<300300<311,因此155无法加入以300
为开头的下降子序列中,300无法加入以311位首的下降子序列中;

我们可以由此发现每段上升子序列中的每个导弹都单独需要一个机器来拦截,
例1没有上升子序列,只有一个下降子序列,需要一台;2上升子序列中有两个导弹,其中一个导弹正好是下降子序列的头;
例3上升子序列中有三个导弹,其中一个导弹是下降子序列的头;
我们这样就大概猜答案用最长上升子序列来做,事实证明这种做法在洛谷里
会只有100分,若想200分用树状数组这个写不来,哈哈哈哈~,还有就是
我这个做法是是有一个定理的叫Dilworth定理,感兴趣的可以上网查一下;

Código

import java.util.Scanner;
public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner input=new Scanner(System.in);
        String [] arr2=input.nextLine().split(" ");
        int N=arr2.length;
        int []dp=new int[N+1];
        int []dp2=new int[N+1];
        int []arr=new int[N+1];
        int index=0;
        for(int i=1;i<=N;i++){
    
    
            arr[i]=Integer.parseInt(arr2[i-1]);
        }
        int max=0;
         for(int i=1;i<=N;i++){
    
    
            dp[i]=1;
            for(int j=1;j<i;j++){
    
    
                if(arr[i]<=arr[j])
                    dp[i]=Math.max(dp[i],dp[j]+1);
                    max=Math.max(dp[i],max);
                
            }
        }
       // 在一个序列中,划分成最少的最长不上升子序列的数量等于这个序列的最长上升子序列的长度
       //所以,我们只要求这个序列最长上升子序列的长度,思路跟第一题差不多,只不过,条件要换成h[i]>h[j]。
        int max2=0;
          for(int i=1;i<=N;i++){
    
    
            dp2[i]=1;
            for(int j=1;j<i;j++){
    
    
                if(arr[i]>arr[j])
                    dp2[i]=Math.max(dp2[i],dp2[j]+1);
                    max2=Math.max(dp2[i],max2);
                    
                
            }
        }
        System.out.println(max);
        System.out.println(max2);
    }

}

Supongo que te gusta

Origin blog.csdn.net/qq_44844588/article/details/108341110
Recomendado
Clasificación