数字三角形
题目描述
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。
输入描述
输入的第一行包含一个整数N (1 ≤ N ≤ 100),表示三角形的行数。
下面的 NN 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。
输出描述
输出一个整数,表示答案。
输入输出样例
输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
27
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
下面展示两种方法,DFS:
import java.util.Scanner;
public class Main {
public static int max=0;//最大路径和
public static int n=0;
public static int v[][]=new int[101][101];//表示访问
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
int a[][] = new int[n][n];
for (int i = 0; i <n ; i++) {
for (int j = 0; j <n ; j++) {
a[i][j]=-1;
}
}
for (int i = 0; i <n ; i++) {
for (int j = 0; j <i+1 ; j++) {
a[i][j]=sc.nextInt();
}
}
v[0][0]=1;
dfs(a,0,0,0,0,0);
System.out.println(max);
}
public static void dfs(int a[][],int x,int y,int step,int left,int right)
{
if(a[x][y]==-1)
{
return;
}
if(x==n-1)
{
step+=a[x][y];
if(left<right-1||left>right+1)
{
return;
}
if(step>max)
{
max=step;
}
return;
}
if(a[x+1][y]!=-1&&v[x+1][y]==0)
{
v[x+1][y]=1;
dfs(a,x+1,y,step+a[x][y],left+1,right);
v[x+1][y]=0;
}
if(a[x+1][y+1]!=-1&&v[x+1][y+1]==0)
{
v[x+1][y+1]=1;
dfs(a,x+1,y+1,step+a[x][y],left,right+1);
v[x+1][y+1]=0;
}
return;
}
}
下面是dp动态规划:
因为这道题加上了一个约束往左总次数和向右总次数不超过1.动态规划感觉就很难实现了。。希望各位能修正我的代码
import java.util.Scanner;
public class Main {
public static int max=0;
public static int v[][]=new int[101][101];//每个结点的值
public static int dp[][]=new int[101][101];
public static int l[][]=new int[101][101];
public static int r[][]=new int[101][101];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
for (int i = 0; i <n ; i++) {
for (int j = 0; j <i+1 ; j++) {
v[i][j]=sc.nextInt();
}
}
for (int i = 0; i <n ; i++) {
dp[n-1][i]=v[n-1][i];
}
for (int i = n-2; i >=0 ; i--) {
for (int j = 0; j <=i ; j++) {
int a=dp[i+1][j];//左
int b=dp[i+1][j+1];//右
if(i==0&&j==0)
{
if(l[i][j]-r[i][j]>1)
{
dp[i][j]=v[i][j]+dp[i+1][j+1];
}
else {
dp[i][j]=v[i][j]+dp[i+1][j];
}
}
if(a>b)
{
l[i][j]++;
dp[i][j]=v[i][j]+dp[i+1][j];
}
else {
r[i][j]++;
dp[i][j]=v[i][j]+dp[i+1][j+1];
}
}
}
System.out.println(dp[0][0]);
}
}