获取生成数组中的最大值
1.题目
2.思路
其实只要看透该题的本质 并不难,应用动态规划,题目就已经给出了状态方程的式子。
首先规定好maxn的大小,防止溢出。定义nums数组。定义一个函数,写入状态方程式子。最后定义一个变量与数组元素进行对比,返回变量。
3.代码
import java.util.Scanner;public class 获取生成数组中的最大值 {static int maxn=110;static int [] nums=new int[maxn];public static int maxNums(int n) {nums[0]=0;nums[1]=1;for(int i=0;i<=n;i++) {if(2<=2*i && 2*i<=n) { //当2<=2*i<=n时,数学形式的表达和代码表达不太一样,注意注意nums[2*i]=nums[i];}if(2<=2*i+1 &&2*i+1<=n) {nums[2*i+1]=nums[i]+nums[i+1];}}int v=0;for(int i=0;i<=n;++i) {v=Math.max(v, nums[i]);}return v;}public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.print("n=");int num=sc.nextInt();System.out.println(maxNums(num));}}
4.知识
1)比大小
v=Math.max(v, nums[i]); 不用导包,记住格式,Math.min();
Math.abs() 返回绝对值; Math.pow(a,b) 返回a的b次幂的值; Math.PI 表示数学常量π的值。
在Java中,Math 类提供了许多常用的数学函数和常量。与 Math.min() 类似,Math 类中还有其他一些常用的数学方法,包括:Math.max(double a, double b): 返回两个 double 值中的较大值。Math.min(int a, int b): 返回两个 int 值中的较小值。Math.abs(int a): 返回 int 值的绝对值。Math.abs(long a): 返回 long 值的绝对值。Math.abs(float a): 返回 float 值的绝对值。Math.abs(double a): 返回 double 值的绝对值。Math.sqrt(double a): 返回 double 值的正平方根。Math.pow(double a, double b): 返回 a 的 b 次幂的值。Math.exp(double a): 返回自然数 e 的 a 次幂的值。Math.log(double a): 返回 double 值的自然对数(以 e 为底)。Math.log10(double a): 返回 double 值的以 10 为底的对数。Math.sin(double a): 返回 double 值(以弧度为单位)的正弦值。Math.cos(double a): 返回 double 值(以弧度为单位)的余弦值。Math.tan(double a): 返回 double 值(以弧度为单位)的正切值。Math.asin(double a): 返回 double 值的反正弦值(以弧度为单位)。Math.acos(double a): 返回 double 值的反余弦值(以弧度为单位)。Math.atan(double a): 返回 double 值的反正切值(以弧度为单位)。Math.atan2(double y, double x): 使用两个参数 y 和 x 的商来计算反正切值(以弧度为单位)。Math.toRadians(double angdeg): 将角度转换为弧度。Math.toDegrees(double angrad): 将弧度转换为角度。Math.random(): 返回一个伪随机数,该数大于等于 0.0 且小于 1.0。Math.PI: 表示数学常量 π 的值。Math.E: 表示数学常量自然对数的底数 e 的值。这只是 Math 类中提供的一些常用方法的概览。你可以在Java的官方文档或其他相关资源中查找更多关于 Math 类的详细信息。
分隔数组以得到最大和
1.题目
2.思路
首先,我们定义一个长度为n的数组dp,其中dp[i]表示将arr数组的前i个元素分隔并变换后能够得到的元素最大和。
然后,我们从左到右遍历arr数组,对于每个位置i,我们考虑将arr[i]作为子数组的最后一个元素,并查找一个合适的分割点j(j < i),使得arr[j+1]到arr[i]这个子数组的长度不超过k,并且arr[j+1]到arr[i]中的最大值乘以子数组的长度加上dp[j]的和最大。
在遍历的过程中,我们需要维护一个变量maxVal,用来记录从当前位置向前回溯k个位置内的最大值,因为我们需要将这个最大值乘以子数组的长度。
最后,dp[n-1]就是我们需要的结果,即将整个数组分隔变换后能够得到的元素最大和。
3.代码
public class 分隔数组 { static int maxn = 510; static int[] dp = new int[maxn]; public int maxSum(int[] arr, int k) { int n = arr.length; for (int i = 0; i < n; i++) { dp[i] = 0; int maxv = arr[i]; // 当前位置的最大值 int cnt = 1; // 当前位置的子数组长度 for (int j = i - 1; j >= Math.max(0, i - k + 1); j--) { maxv = Math.max(maxv, arr[j]); // 更新最大值 cnt++; // 增加子数组长度 dp[i] = Math.max(dp[i], dp[j] + cnt * maxv); // 更新dp[i] } } return dp[n - 1]; } public static void main(String[] args) { 分隔数组 solution = new 分隔数组(); int[] arr = {1, 15, 7, 9, 2, 5, 10}; int k = 3; int result = solution.maxSum(arr, k); System.out.println(result); // 输出应为84 }
}