1:题目描述
作者:海森堡CSQ
链接:https://www.nowcoder.com/discuss/391530?type=post&order=time&pos=&page=1
来源:牛客网
第一题,给定一个数组n,比如
5 10 5 4 4
1 7 8 4 0
3 4 9 0 3
从每一列选择一个数,求出后一列减去前一列的绝对值的和的最小值
比如这里就是5 7 5 4 4,所以输出是5
2:解题思路
本地我们经过分析,可以明确发现本列最短路径和下一列最短路径之间有很大的关系,我们可以使用动态规划的思想解决这个问题;
- 状态定义:如何定义出可以找到转移方程的状态,是这个问题的关键。我们分析发现相邻两列之间的最短路径之间关系如下;假设dp[0],dp[1]和dp[2]分别代表从第一列到达此列的第0行数,第1行数,第2行数的最短路径,那么到达后一列的第0行,第1行和第2行的最短路径和dp[0],dp[1],dp[2]有什么关系尼?显然假设后一列第0行,第1行,第2行的最短路径分别为next[0],next[1],next[2],第0行数据为 n[0],第1行数据为 n[1],第2行数据为 n[2],则有,next[0] = min(abs(dp[0]-n[0]),abs(dp[1]-n[0]),abs(dp[2]-n[0]))。这是什么含义尼?就是本列的三行分别到n[0]处的路径中最短一个就为最短一个。所以定义状态dp[0],dp[1],dp[2]分别待变到达本列第0行,第1行,第2行的最短路径。
- 转移方程:正如上面个描述的那样
- next[0] = min(abs(dp[0]-n[0]),abs(dp[1]-n[0]),abs(dp[2]-n[0]))。
- next[1] = min(abs(dp[0]-n[1]),abs(dp[1]-n[1]),abs(dp[2]-n[1]))。
- next[2] = min(abs(dp[0]-n[2]),abs(dp[1]-n[2]),abs(dp[2]-n[2]))。
- 暂存结果:使用dp[0],dp[1],dp[2]来保存上面的next结果,为后面的循环做准备。
3:代码示例
package NiuKe;
/**
* @author :dazhu
* @date :Created in 2020/3/20 18:50
* @description:AC测试
* @modified By:
* @version: $
*/
import java.util.*;
public class Main {
static int n;
static int[][] array;
static int postTemp = 0;//下一列选择地值
static int curTemp = 0;//当前列选择地值
static int resultSum = 0;//当前和
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
array = new int[3][n];
for(int i = 0; i < 3; i++){
for(int j = 0; j < n; j++){
array[i][j] = sc.nextInt();
}
}
System.out.println(getMin(array));
}
public static int getMin(int[][]array){
if(array[0].length ==1){
return 0;
}
int[] dp = new int[]{0,0,0};
int[] temp = new int[]{0,0,0};
//1 2 3 4 5
//2 3 4 5 6
//23 45 12 5 2
for(int i=1;i<n;i++){//外循环控制列数
for(int j=0;j<3;j++){//内训还控制行数
//按照状态转移方程,更新的新的最短路径
temp[j] = Math.min(Math.min(Math.abs(array[j][i] - array[0][i-1]) + dp[0],
Math.abs(array[j][i] - array[1][i-1]) + dp[1]),
Math.abs(array[j][i] - array[2][i-1]) + dp[2]);
}
//寄存结果
for(int k=0;k<3;k++){
dp[k] = temp[k];
}
}
return Math.min(Math.min(dp[0], dp[1]),dp[2]);
}
}
来源:https://www.cnblogs.com/dazhu123/p/12567414.html