算法--动态规划--环形数组的最大贡献值
小S拿到了一个长度为 nn 的环形数组,并定义了两个下标 ii 和 jj 的贡献值公式为:f(i, j) = (a_i + a_j) × dist(i, j)
其中 dist(i, j)
是下标 ii 和 jj 在数组中的最短距离。小S希望找到一对下标,使得它们的贡献值尽可能大。环形数组的特点是最左和最右的元素也是相邻的。你需要帮助她找到最大贡献值。
例如,给定数组 [1, 2, 3]
,由于是环形数组,任意两个下标的距离都是1,因此 f(2,3)=(2+3)×1=5f(2,3)=(2+3)×1=5。
思路:求最大值,总是要遍历每一种情况,使用双层循环直接实现,疑惑的是,标签是动态规划,但是我没有感受到哪里需要动态规划:
public class Main {
public static int solution(int n, int[] a) {
//最短距离的实现
//捋一下思路
//遍历每一种情况,判断每一种情况的大小,时间复杂度为2次方
if(a.length == 1) return 0;
int max = (a[0] + a[1]) * 1;
for(int i = 0; i < a.length - 1; i++){
for(int j = i + 1; j < a.length; j++){
int temp = (a[i] + a[j]) * caculate(i,j,a);
if(max < temp){
max = temp;
}
}
}
return max;
}
public static int caculate(int i, int j,int[] a){
int result = 0;
return result = j - i > a.length - j + i ? a.length - j + i : j - i;
}
public static void main(String[] args) {
System.out.println(solution(3, new int[]{1, 2, 3}) == 5);
System.out.println(solution(4, new int[]{4, 1, 2, 3}) == 12);
System.out.println(solution(5, new int[]{1, 5, 3, 7, 2}) == 24);
}
}