硬币收集

题目中 n * m 的木板
在题中 通过 1 表示有硬币 0 表示没有硬币

通过 C[][] n = 3 m = 4 来分析思路
0 1 1 0
1 0 1 0
0 1 1 1

从 (0,0) 走到 (2,3)
如果需要知道 (0,0) 是往右边还是往下边走 则需要知道 右边 和 下边 的 大小

下一步 计算 每一步的 的大小 用一个于 数据大小相同数组 F[][]
第一排计算 全部往右走
0 1 2 2 从(0,0) 一直向右 F[0][i] = F[0][i-1] + C[0][i] i > 1
1 1 3 2 从(1,0) 一直向右 初始化 F[1][0] = F[0][0] + C[1][0] F[1][i] = max(F[0][i],F[1][i-1])+ C[1][i]
1 2 4 5 同理 依次往下递推

如果需要知道走过的点 则需要回溯 通过F[][] 减去当前点的值 选择路线

  Scanner in = new Scanner(System.in);
		int n,m;
		n = in.nextInt();
		m = in.nextInt();
		int[][] target = new int[n][m];
		int[][] F = new int[n][m];
        for(int i = 0; i < n; i ++) {
			for(int j = 0; j < m; j ++) {
				C[i][j]= in.nextInt();
			}
		}
		F[0][0] = target[0][0];
		for (int j = 1; j < m; j++) {
			F[0][j] = F[0][j - 1] + target[0][j];
		}
		for (int i = 1; i < n; i++) {
			F[i][0] = F[i - 1][0] + target[i][0];
			for (int j = 1; j < m; j++) {
				F[i][j] = Math.max(F[i - 1][j], F[i][j - 1]) + target[i][j];
			}
		}
		System.out.println("最大值:"+F[n - 1][m - 1]);
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < m; j++) {
				System.out.print(F[i][j]);
			}
			System.out.println();
		}
		int count = F[n - 1][m - 1];
		// 回溯
		for (int i = n - 1, j = m - 1; i > 0 && j > 0;) {
			count -= target[i][j];
			if (F[i - 1][j] == count) {
				--i;
			} else {
				--j;
			}
			System.out.println("["+i+","+j+"]");
		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值