第一题 第n个数
2,3,5组合成数字,可重复使用,求从小到大第n个
思路:从全排列树找规律,组成的数字从小到大就是全排列树层次遍历的顺序。
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] nums = new int[n+1];
nums[1] = 2;
nums[2] = 3;
nums[3] = 5;
for (int i = 4; i < n + 1; i++) {
if(i % 3 == 1){
nums[i] = nums[(i-1)/3] * 10 + 2;
}else if(i % 3 == 2){
nums[i] = nums[(i-2)/3] * 10 + 3;
}else{
nums[i] = nums[(i-3)/3] * 10 + 5;
}
}
System.out.println(nums[n]);
}
} 第二题
在金字塔中找路径和最大值,从顶部开始,可向下,左下,右下。
思路:从顶部开始遍历,计算当前结点可移动到的位置,也就是下一层对应的三个结点。
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[][] nums = new int[n][2*n+1];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 2 * i + 1; j++) {
nums[i][j] = scanner.nextInt();
}
}
int[][] dp = new int[n][2*n+1];
dp[0][0] = nums[0][0];
int res = 0;
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < 2 * i + 1; j++) {
dp[i+1][j] = Math.max(dp[i+1][j],dp[i][j]+nums[i+1][j]);
dp[i+1][j+1] = Math.max(dp[i+1][j+1],dp[i][j]+nums[i+1][j+1]);
dp[i+1][j+2] = Math.max(dp[i+1][j+2],dp[i][j]+nums[i+1][j+2]);
}
}
for (int i = 0; i < 2*n+1; i++) {
res = Math.max(res,dp[n-1][i]);
}
System.out.println(res);
}
} 第一次写,写的不好请见谅😅😅
全部评论
(2) 回帖