NC220755. 宝物就是你决定性的瞬间
描述
输入描述
第一行输入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; }