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;}
}