T1.求m*n网格路径和的最大值
1.题目描述
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最大。
说明:每次只能向下或者向右移动一步。
2.题目示例
{{2,3,1},{2,5,3},{4,2,1}}
返回14
3.思路及代码
- 思路:简单动规思想,分为几种情况分开讨论即可。
- 1.当为上边界,它只能由它的左边的元素得到值
- 2.当为左边界,它只能由它的上边的元素得到值
- 3.当处于中间时,它要从它的上边和左边选择最大的
- 最后返回最后一个元素即可,原地操作就行了
- 代码:
public int maxValue (int[][] matrix) {
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
//顶点跳过
if(i == 0 && j == 0){
continue;
}else if(i == 0){//上边界
matrix[i][j] = matrix[i][j] + matrix[i][j - 1];
}else if(j == 0){//左边界
matrix[i][j] = matrix[i][j] + matrix[i - 1][j];
}else{
//求最大值
matrix[i][j] = Math.max(matrix[i][j - 1], matrix[i - 1][j]) + matrix[i][j];
}
}
}
//返回右下角的元素即可
return matrix[matrix.length - 1][matrix[0].length - 1];
}
T2.求200之内的正整数的阶乘
1.题目描述
输入一个数,如果该数n,在 1=<n<=200时计算阶乘并输出,不在此范围内输出Error
2.题目示例
- 示例一:
- 10---->输出3628800
- 示例二:
- 201---->输出Error
3.思路及代码
- 思路:这题主要就是对数据的一个处理,无论是用int还是long都会溢出,所以这里我们要用java中提供的BigInteger类来做就不会溢出,看代码
- 代码:
package DemoTest;
import java.math.BigInteger;
import java.util.*;
public class Demo003{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if(n < 1 || n > 200){
System.out.println("Error");
return;
}
BigInteger sum = new BigInteger("1");
while(n > 0){
sum = sum.multiply(new BigInteger(String.valueOf(n)));
n--;
}
System.out.println(sum);
}
}