785. 最大权值和路径

题目:

有一个机器人位于一个 m × n 个网格的右上角。
机器人每一时刻只能向下或者向左移动一步。机器人试图达到网格的左下角。每个网格上有一个数字权值,机器人希望它走到左下角的路径权值和最大

问这个最大路径权值和是多少?


样例:

        给出 [[1,2,3,4],[3,5,6,7],[9,10,1,2],[4,4,5,5]] ,返回45

    解释:从右上角出发,沿着[4,7,6,5,10,9,4]走到左下角。权值和为45。


第一次测试:

public class Solution {
	public static void main(String[] args) {
		 int[][] nums = { { 22, 17, 16, 6, 15 }, { 22, 9, 14, 9, 7 },
		 { 4, 10, 6, 18, 8 }, { 22, 25, 13, 3, 1 }, { 16, 24, 21, 3, 2 } };
		System.out.println(maxWeight(nums));
	}

	/**
	 * 求最大权值
	 */
	public static int maxWeight(int[][] nums) {
		int i = 0;
		int j = nums[0].length - 1;
		int sum = nums[i][j];
		while (i != nums.length - 1 || j != 0) {
			System.out.println("i:" + i + "j:" + j);
			if (j == 0) {
				sum = sum + nums[i + 1][j];
				i++;
				continue;
			}
			if (i == nums.length - 1) {
				sum = sum + nums[i][j - 1];
				j--;
				continue;
			}
			if (nums[i][j - 1] > nums[i + 1][j]) {
				sum = sum + nums[i][j - 1];
				j--;
				continue;
			} else {
				sum = sum + nums[i + 1][j];
				i++;
				continue;
			}
		}
		return sum;
	}
}

结果是133,成功!,

第二次测试:

public class Solution {
	public static void main(String[] args) {
		String str = "[[30,30,4,97,48,84,12,44,41,50],[92,80,50,35,5,1,24,60,84,76],[24,82,94,18,64,36,36,17,44,5],[0,5,80,80,60,55,20,60,81,92],[8,18,0,86,48,91,22,8,44,67],[20,84,52,49,74,16,90,15,83,9],[11,2,42,58,76,78,68,11,54,76],[64,36,10,60,6,90,14,40,0,92],[34,60,52,49,63,28,68,40,80,64],[0,25,56,50,21,12,80,75,38,68]]";
		int[][] nums = change(str);
		System.out.println(maxWeight(nums));
	}

	/**
	 * 求最大权值
	 */
	public static int maxWeight(int[][] nums) {
		int i = 0;
		int j = nums[0].length - 1;
		int sum = nums[i][j];
		while (i != nums.length - 1 || j != 0) {
			System.out.println("i:" + i + "j:" + j);
			if (j == 0) {
				sum = sum + nums[i + 1][j];
				i++;
				continue;
			}
			if (i == nums.length - 1) {
				sum = sum + nums[i][j - 1];
				j--;
				continue;
			}
			if (nums[i][j - 1] > nums[i + 1][j]) {
				sum = sum + nums[i][j - 1];
				j--;
				continue;
			} else {
				sum = sum + nums[i + 1][j];
				i++;
				continue;
			}
		}
		return sum;
	}

	/**
	 * 把字符串转成int[][]
	 */
	private static int[][] change(String str) {
		String[] s = str.split("[,\\]\\[]");
		int k = 0;
		String[][] arr = new String[10][10];
		int[][] in = new int[10][10];
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 10;) {
				if (!s[k].equals("")) {
					arr[i][j] = s[k];
					j++;
				}
				k++;
			}
		}
		for (int i = 0; i < in.length; i++) {
			for (int j = 0; j < in.length; j++) {
				in[i][j] = Integer.parseInt(arr[i][j]);
			}
		}
		return in;
	}
}

结果是1018,正解是1102,失败!

接下来我画图研究了我的算法,我发现我的算法是从右上角开始,每次选择此格的左边或下边较大的一个格子去走,但是我画出图来后发现这种算法并不能得到最大权值。

   


算法修改中....




阅读更多
文章标签: java 算法
个人分类: 算法题
下一篇spring事务管理之通过xml配置aop事务
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭