蓝桥杯数组切分 dfs dp 两种解法

dfs写法参考https://blog.csdn.net/xyint/article/details/129448056#comments_25796112
dp写法参考:https://leetcode.cn/problems/min-cost-climbing-stairs/description/

import java.util.Arrays;
import java.util.Scanner;

public class 第十三届_数组切分 {

//	dfs 50%
//	static int n;
//	static int[] arr;
//	static int sum = 0;
//	static int maxNum = Integer.MIN_VALUE;
//	static int minNum = Integer.MAX_VALUE;
//	public static void main(String[] args) {
//		// TODO Auto-generated method stub
//		Scanner sc = new Scanner(System.in);
//		n = sc.nextInt();
//		arr = new int[n];
//		for(int i = 0; i
//			arr[i] = sc.nextInt();
//		}
//		dfs(0);
//		System.out.print(sum%1000000007);
//	}
//	private static void dfs(int index) {
//		// TODO Auto-generated method stub
//		if(index==n) {
//			sum++;
//			return;
//		}
//		for(int i = index; i
//			// 找出最大最小值
//			updateMaxAndMin(index,i);
//			if((maxNum-minNum) == (i-index)) {
//				/*
//				 * 如果不恢复,则下次找出最大最小值时有误
//				 * 比如3 2 4,首先遍历了3和2
//				 * max=3 min=2
//				  *下去进入updateMaxAndMin函数时
//				 * max就不是Integer.MIN_VALUE
//				 * min就不是Integer.Max_VALUE
//				 */
//				renew(maxNum, minNum);
//				dfs(i+1);
//				renew(maxNum, minNum);
//			}
//		}
//	}
//	private static void renew(int maxNum2, int minNum2) {
//		// TODO Auto-generated method stub
//		maxNum = Integer.MIN_VALUE;
//		minNum = Integer.MAX_VALUE;
//	}
//	private static void updateMaxAndMin(int start, int end) {
//		// TODO Auto-generated method stub
//		for(int i = start; i<=end; i++) {
//			maxNum = Math.max(arr[i], maxNum)%1000000007;
//			minNum = Math.min(arr[i], minNum)%1000000007;
//		}
//	}

//	dp AC
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int MAX = Integer.MIN_VALUE;
		int MIN = Integer.MAX_VALUE;
		long MOD = 1000000007L;
		int[] arr = new int[n+1];
		for(int i = 1; i<=n; i++) arr[i] = sc.nextInt();
		// 0-i种能组成多少种方案
		int[] dp = new int[n+1];
		/*
		 *  初始化:前0种能组成1种方案,我也不知道为什么可以是1种
		 *  不过其他一些线性dp的题也是把前0种看成一种方案
		 *  比如砝码称重,dp[0][0]:0个砝码可以称的重量为0也算作一种方案
		 */
		dp[0] = 1;
		for(int i = 1; i<=n; i++) {
			// 找出[j,i]区间内的最大值和最小值
			MAX = Math.max(MAX, arr[i]);
			MIN = Math.min(MIN, arr[i]);
			for(int j = i; j>=1; j--) {
				MAX = Math.max(MAX, arr[j]);
				MIN = Math.min(MIN, arr[j]);
				if((MAX - MIN) == i-j) {
					dp[i] = (int) (dp[i]%MOD + dp[j-1]%MOD);
				}
			}
			// 需要恢复,不然影响后面的判断
			MAX = Integer.MIN_VALUE;
			MIN = Integer.MAX_VALUE;
		}
		System.out.print(dp[n]%MOD);
	}
}

你可能感兴趣的:(蓝桥杯,深度优先,动态规划)