列表

详情


NC220755. 宝物就是你决定性的瞬间

描述

小豆队决定在城镇中找礼物,她们有一张m*n的地图,上面记录了该点礼物的价值或者该点是否是墙壁,如果该点是墙壁,那么将无法通行。
小豆队从左上角出发,因为有热可可在后面跟踪,所以小豆队无法回头(即她们只能向下或者右移动),请输出小豆队所能找到的礼物的最大价值。

输入描述

第一行输入m,n代表一个m行n列的地图(1 <= m, n <= 10)

然后m行每行以空格为分割输入n个字符代表礼物的价值k(0 <= k < 10)或者墙壁-1 

输出描述

输出所能找到的礼物的最大价值

示例1

输入:

3 3
1 2 3
2 -1 3
3 2 3

输出:

12

说明:

走到最右后走到最下即可

示例2

输入:

4 5
1 -1 2 3 4
2 3 -1 1 3
-1 4 -1 1 2
4 -1 3 1 4

输出:

10

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java(javac 1.8) 解法, 执行用时: 48ms, 内存消耗: 12488K, 提交时间: 2021-04-20 15:43:31

import java.util.Scanner;

public class Main {
    public static int find(int x, int y,int[][] map,int lenth,int width){
        if(x<1||y<1||x>lenth||y>width){
            return 0;
        }else if(map[x][y] == -1){
            return 0;
        }
        int right = find(x+1,y,map,lenth,width);
        int down = find(x,y+1,map,lenth,width);
        if(right >= down){
            return right + map[x][y];
        }else{
            return down + map[x][y];
        }
    }

    public static void main(String[] args) {
        int[][] map = new int[12][12];
        int lenth = 0, width = 0;
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();
        lenth = x;
        int y = sc.nextInt();
        width = y;
        for(int i = 1; i <= x; i++){
            for(int j = 1; j <= y; j++){
                map[i][j] = sc.nextInt();
            }
        }
        System.out.println(find(1,1,map,lenth,width));
    }
}

C++(clang++11) 解法, 执行用时: 9ms, 内存消耗: 476K, 提交时间: 2021-04-22 17:58:49

#include<iostream>
#include<string>
int max(int x,int y);
int dfs(int y,int x);
int arr[12][12];
int sum=0;
using namespace std;
int main()
{
	int m,n;
	cin>>m>>n;
	for(int i=1;i<=12;i++)
	for(int j=1;j<=12;j++)
	{
		arr[i][j]=-1;
	}
	for(int i=1;i<=m;i++)
	for(int j=1;j<=n;j++)
	{
		cin>>arr[i][j];
	}
	cout<<dfs(1,1);
}
int dfs(int y,int x)
{
    if(arr[y][x]==-1)
    return 0;
    else
    return sum=arr[y][x]+max(dfs(y+1,x),dfs(y,x+1));
}
int max(int x,int y)
{
	return x>y?x:y;
}

上一题