2017年华为优招机试题_平安果_编程题

题目描述

简要描述: 给定一个M行N列的矩阵(M*N个格子),每个格子中放着一定数量的平安果。

你从左上角的格子开始,只能向下或向右走,目的地是右下角的格子。

每走过一个格子,就把格子上的平安果都收集起来。求你最多能收集到多少平安果。

注意:当经过一个格子时,需要要一次性把格子里的平安果都拿走。

限制条件:1 < N, M <= 50;每个格子里的平安果数量是0到1000(包含0和1000)。

输入描述:

输入包括两行:
第一行为矩阵的行数M和列数N
第二行为一个M*N的矩阵,矩阵的数字代表平安果的数量,例如:
1 2 3 40
6 7 8 90

输出描述:

输出一个数字,表示能可以收集到的平安果的数量。

示例1

输入

2 4
1 2 3 40
6 7 8 90

输出

136

动态规划求解

解析:设dp[i][j]为走到i*j位置的路径长度,那么显而易见 dp[i][j] = Math.max(dp[i][j - 1] + num[i][j], dp[i - 1][j] + num[i][j]);

Java程序

import java.util.Scanner;

public class PingAnGuoDp

{

public static void main(String[] args)

{

Scanner in = new Scanner(System.in);

while (in.hasNext())

{

String s = in.nextLine();

String[] str = s.split(" ");

int M = Integer.parseInt(str[0]);

if (M<=1||M>50)

{

break;

}

int N = Integer.parseInt(str[1]);

if (N<=1||N>50)

{

continue;

}

int num[][] = new int[M][N];

for (int i = 0; i < M; i++)

{

String st = in.nextLine();

String[] strs = st.split(" ");

for (int j = 0; j < strs.length; j++)

{

num[i][j] = Integer.parseInt(strs[j]);

if(num[i][j]<0||num[i][j]>1000){

;

}

}

}

System.out.println(getMaxValue(num));

}

}

/** 获得最多的平安果*/

public static int getMaxValue(int[][] num)

{

int Row = num.length;

int Col = num[0].length;

int[][] dp = new int[Row][Col];

/*

dp[0][0]=num[0][0];

for(int i=1;i<Row;i++) { dp[i][0]=dp[i-1][0]+num[i][0]; } //为DP第0行赋值

for(int i=1;i<Col;i++) { dp[0][i]=dp[0][i-1]+num[0][i]; }

*/

// DP第0列赋值

for (int i = 0; i < Row; i++)

{

for (int j = 0; j <= i; j++)

{

dp[i][0]+= num[j][0];

}

}

// DP第0行赋值

for (int i = 0; i < Col; i++)

{

for (int j = 0; j <= i; j++)

{

dp[0][i] += num[0][j];

}

}

for (int i = 1; i < Row; i++)

{

for (int j = 1; j < Col; j++)

{

dp[i][j] = Math.max(dp[i][j - 1] + num[i][j], dp[i - 1][j] + num[i][j]);

}

}

return dp[Row - 1][Col - 1];

}

}

c++程序

#include<iostream>

using namespace std;

#include<vector>

#include<queue>

typedef struct Pos

{

int x;

int y;

Pos(int x,int y){this->x=x;this->y=y;}

} Pos;

int main()

{

int row,column;

cin>>row>>column;

vector<vector<int>> grid(row,vector<int>(column,0));

vector<vector<int>> map(row,vector<int>(column,0));

for(int i=0;i<row;i++)

for(int j=0;j<column;j++)

cin>>grid[i][j];

queue<Pos> q;

q.push(Pos(0,0));

map[0][0]=grid[0][0];

while(!q.empty())

{

Pos p=q.front();

int x=p.x,y=p.y;

q.pop();

if(x<grid.size()-1)

{

if(map[x+1][y]==0) q.push(Pos(x+1,y));

map[x+1][y]=max(map[x][y]+grid[x+1][y],map[x+1][y]);

}

if(y<grid[0].size()-1)

{

if(map[x][y+1]==0)  q.push(Pos(x,y+1));

map[x][y+1]=max(map[x][y]+grid[x][y+1],map[x][y+1]);

}

}

cout<<map[grid.size()-1][grid[0].size()-1];

return 0;

}

				
时间: 2024-10-08 14:14:43

2017年华为优招机试题_平安果_编程题的相关文章

2017华为优招笔试题

  哎,没有接到笔试通知,不知道为啥就错过了. 之后见到题目,前两道编程题.其实都见过类似的题目,有点思路,但是直接快速完整实现出来,水平还是达不到. 这样的题目,也不算难,三道编程题至少AC两道才算可以.但是自己还是写代码写的少,需要多练习,增加熟练度. 第一道题,统计一个字符串中,出现的字母字符串,数字字符串和其他字符组成的字符串的个数. 思想非常简单直观,但对于边界条件以及何时将统计的数量进行增加要仔细考虑. 代码如下: #include <iostream> #include <

华为的一道机试题--等式变换

华为的一道机试题 (http://blog.csdn.net/zombie_slicer/article/details/37346025) 第三题:等式变换 输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立. 1 2 3 4 5 6 7 8 9 = X 比如: 12-34+5-67+89 = 5 1+23+4-5+6-7-8-9 = 5 请编写程序,统计满足输入整数的所有整数个数. 输入:       正整数,等式右边的数字 输出:       使该等式成立的个数 样

1022: 淘金(2017年中南大学研究生复试机试题 )

1022: 淘金 时间限制: 1 Sec  内存限制: 128 MB提交: 205  解决: 75[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 在一片n*m的土地上,每一块1*1的区域里都有一定数量的金子.这一天,你到这里来淘金,然而当地人告诉你,如果你挖了某一区域的金子,上一行,下一行,左边,右边的金子你都不能被允许挖了.那么问题来了:你最多能淘金多少? 输入 对于每组数据,第一行两个数n,m,表示土地的长和宽(1<=n,m<=200) 接下来n行,每行m个数,表示每个区域

1021: 机器人走迷宫(2017年中南大学研究生复试机试题 )

1021: 机器人走迷宫 时间限制: 1 Sec  内存限制: 128 MB提交: 339  解决: 71[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 有一个愚蠢的机器人走进一个w*h的迷宫,迷宫里有空地和陷阱.他想要访问迷宫的每个方格,但是它很笨,只会按照指令的方向走.当机器人不能走的时候,也就是下一步会遇到陷阱.迷宫边界或者访问过的格子,它会向右转90度(顺时针旋转90度,不能访问已经访问过的方格,且在原地只转一次,移动后可获得又一次旋转机会).请问这个机器人最多可以经过多

华为补招笔试题20171130

注:实现时无需考虑不合法的情况. 解答过程:感觉没有问题,可后来通过率才37.5%,puzzle. #include <iostream> using namespace std; #include <string> #include <vector> #include <algorithm> //转化为大写 string strToUpper(string &str) { for (int i = 0; i < str.size(); i++

2017腾讯秋招笔试题之编码

Description: 假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, - -, b, ba, baa, baaa, baab, baac - -, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推.    编写一个函数,输入是任意一个编码,输出这个编码对应的Index Input: 输入一个待编码的字

华为2016年机试题: 最高分是多少

老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据. 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目. 学生ID编号从1编到N. 第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩 接下来又M行,每一行有一个字符C(只取'Q'或'U'),和两个正整数A,B,当C为'Q'的时候, 表

1023: 巨人排队(2017年中南大学研究生复试机试题 )

1023: 巨人排队 时间限制: 1 Sec  内存限制: 128 MB提交: 185  解决: 58[提交] [状态] [讨论版] [命题人:外部导入] 题目描述 巨人国的小学生放假了,老师要给小朋友们排队了.可是这个老师有强迫症,一定要路队上的小朋友按照身高从高到矮排序(也就是排在前面的不能比后面的矮).小朋友呢也很调皮,一旦老师给他排好队就不愿意动了.这个时候小朋友们一个一个的从教室里出来了,每个小朋友一出来老师就要给小朋友安排好位置.请问老师最少要给小朋友排几条路队呢? 输入 对于每组数

中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机

期末考试编程题 返回 这是期末考试的编程题 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 细胞自动机(30分) 题目内容: 这是细胞自动机的非图形版本.细胞自动机是指在一个二维网格内,每一个网格是一个细胞.每个细胞有活和死两种状态. 初始时刻,有些细胞是活的,有些细胞是死的.自动机的每一步,根据每个细胞周围8个格子内的其他细胞的生存情况决定这个细胞下一步是否存活.具体的规则如下: