资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。
输入格式
输入的第一行包含一个整数N,表示三角形的行数。下面的N行给出数字三角形。数字三角形上的数都是0至100之间的整数。
输出格式
输出一个整数,表示答案。
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Data
样例输出
27
思路:先用dp求解出最大值以后,由题意可知,向左走和向右走的次数不能超过一,这句话的另外一层含义为:当N为奇数时,最大值为求解出dp后的最后一行的中间的那个数;当N为偶数时,最大值为求解出dp后中间两个数的最大者。
代码:
public class ttttt { public static void main(String[] args){ Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int[][] arr=new int[n][n]; for (int i=0;i<n;i++){ for (int j=0;j<=i;j++){ arr[i][j]=sc.nextInt(); } } for (int i=1;i<n;i++){ arr[i][0]+=arr[i-1][0]; arr[i][i]+=arr[i-1][i-1]; } for (int i=2;i<n;i++){ for (int j=1;j<i;j++){ arr[i][j]+=Math.max(arr[i-1][j-1],arr[i-1][j]); } }//到这里时,已经求解完dp数组 if (n%2==1){ System.out.println(arr[n-1][n/2]);//n为奇数,中间的那个数为最大值 }else { System.out.println(Math.max(arr[n-1][n/2],arr[n-1][n/2-1]));//n为偶数,中间两个数的最大者为最大值,这样子也能保证左右相差不超过1 } } }