1.蓝桥勇士

Problem: 蓝桥勇士

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

这是一个典型的动态规划问题,我们可以使用最长递增子序列(LIS)的思想来解决。我们可以定义一个数组dp,其中dp[i]表示以第i个对手结束的最长挑战序列的长度。对于每一个对手,我们都尝试将其加入到所有在其之前的对手所能形成的挑战序列中,如果当前对手的战力值大于前面对手的战力值,那么就可以将其加入到挑战序列中,更新dp[i]的值。最后,我们只需要找出dp数组中的最大值,就是小明最多会挑战的对手数量。

解题方法

1.初始化dp数组,dp[i] = 1,表示每个对手都可以单独形成一个挑战序列。
2.从第二个对手开始,遍历其之前的所有对手,如果当前对手的战力值大于前面对手的战力值,那么就尝试将其加入到挑战序列中,更新dp[i]的值,dp[i] = max(dp[i], dp[j] + 1)。
3.遍历dp数组,找出最大值,即为小明最多会挑战的对手数量。

复杂度

时间复杂度:

遍历所有对手,对于每个对手,都需要遍历其之前的所有对手,所以时间复杂度为 O ( n 2 ) O(n^2) O(n2)

空间复杂度:

我们需要一个长度为n的dp数组来存储状态,所以空间复杂度为O(n)。

Code


import java.util.*;
import java.io.*;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
  static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  static StreamTokenizer sr = new StreamTokenizer(in);
  static int n;
  static int MAXN = 1010;
  static int[] arr= new int[MAXN];
  static int[] dp = new int[MAXN];
    public static void main(String[] args) throws IOException {
     n = nextInt();
     for(int i = 1; i <= n; i++) {
       arr[i] = nextInt();
     }
     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);
       }
     }
     int ans = 0;
     for(int i = 1; i <= n; i++) {
       ans = Math.max(dp[i], ans);
     }
     out.println(ans);
     out.flush();

        
    }
    static int nextInt() throws IOException {
      sr.nextToken();
      return (int) sr.nval;
    }
}

你可能感兴趣的:(算法模板,蓝桥云课,动态规划)