首页 新闻 会员 周边 捐助

看了网上很多解法,都没找到 =。=~ 求算法大神~~

0
悬赏园豆:20 [待解决问题]

【搜索算法】 求大神 使用 JS JAVA Python 都可~~ 能看懂~~
根据客户提供的二维数字矩阵地图,从左上角出发,每次可以向下或向右走,直到到达右下角,途中经过的路径上的数字加起来,得到的数应该是一个最大的数
1.输出路径及累计值
2.提供二维数组的输入(文本文件导入或JS文件导入)
3.输出每次搜索花的时间,比如:输入二维数组 输出结果 和 搜索用的时间
4.最大二维数组为:200x200,最小二维数组为2x2;

【题目描述】
1.例如,文本文件中内容如下:(如果采用JS编写,数组可以放到JS文件中)
二维数组:
[10, 10, 10, 10],
[1, 2, 2, 10],
[1, 2, 2, 10],
[1, 2, 3, 10],
[2, 2, 1, 10]
输出:
最大值:80
路径: 右 右 右 下 下 下 下
耗时:***ms

2.说明:
题目规则:二组数组, 从坐标(0,0)出发,只能向下或向右,终点为右下角

cnmz的主页 cnmz | 初学一级 | 园豆:10
提问于:2018-12-26 21:03
< >
分享
所有回答(4)
0

package com.eastcom.comm;

public class test {
static StringBuffer str = new StringBuffer();

public static int MaxRoad(int arr[][]) {
    int mr[] = new int[arr[0].length];
    mr[0] = arr[0][0];
    for (int j = 1; j < arr[0].length; j++) {
        mr[j] = mr[j - 1] + arr[0][j];
        str.append("右");
        // 求出第一行的dp
    }
    for (int i = 1; i < arr.length; i++) {
        mr[0] = arr[i][0] + mr[0];
        // dp[0]代表每一行最左边的dp,
        // 后一行的dp覆盖前一行的dp
        for (int j = 1; j < arr[0].length; j++) {
            mr[j] = Math.max(mr[j - 1] + arr[i][j], mr[j] + arr[i][j]);

        }
        str.append("下");
    }

    return mr[arr[0].length - 1];
}

public static void main(String[] args) {

    int[][] martix = { { 10, 10, 10, 10 }, { 1, 2, 2, 10 }, { 1, 2, 2, 10 }, { 1, 2, 3, 10 }, { 2, 2, 1, 10 } };

    long startTime = System.currentTimeMillis();
    long i = MaxRoad(martix);
    long endTime = System.currentTimeMillis();
    
    System.out.println("最大值:" + i );
    System.out.println("路径:" + str);
    System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
}

}

搞定~~~~

cnmz | 园豆:10 (初学一级) | 2018-12-26 21:47
0

用回溯算法会比较容易点。

Timothy-Lau | 园豆:351 (菜鸟二级) | 2018-12-27 11:13
0

var arr = [
[10, 10, 3, 4],
[1, 10, 10, 10],
[1, 2, 2, 10],
[1, 2, 3, 10],
[2, 2, 1, 10]
];
var xm = arr.length; //x 最大值
var ym = arr[0].length; // y最大值

var bestl = 0; //记录最优解
var r = [];    //记录最优解的路径

var path = []; //临时路径
var c = 0;     //临时最优解
trace(0,0);
console.log(bestl)
console.log(r)
function trace(x,y){
    if(x < xm && y < ym){  //当还没有到达终点时,可以继续搜索
        c = c + arr[x][y];  //加上当前点,继续遍历
        path.push({x:x,y:y}); //加入当前点路径
        trace(x+1,y);
        trace(x,y+1);
        c = c - arr[x][y]; //遍历结束,回退到上级
        path.pop();         //回退到上级 
    }else if(x >= xm-1 && y >= ym-1){ //到达终点
        if(c > bestl){  //到达终点,并且比最优解还大,则记录
            bestl = c;
            r = path.slice(0);
        }
    }
}
muamaker | 园豆:763 (小虾三级) | 2018-12-28 18:02

3Q MUCH~ :)

支持(0) 反对(0) cnmz | 园豆:10 (初学一级) | 2019-01-01 20:18
0


上条边的最大值和左条边的最大值没得选,因为路径的唯一性,很容易就算出来,如上。

然后再按红线的顺序算出各个点的最大路径值。

窗户 | 园豆:886 (小虾三级) | 2019-01-30 18:16
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册