蓝桥杯真题———数字三角形
我还是个小白分享一下,不过这个题做的还是有一点问题,有一部分样例过不了,欢迎大佬纠正。
我看了一下别人的博客,好像有很多人没有考虑到左右次数不能超过1的条件。
因为刚接触算法许多的算法都还没记过,做得可能相对比较复杂,请见谅!
import java.util.Scanner;
public class 第8题 {
static int max=0;
static int left=0;//计算左边的次数
static int rignt=0;//计算右边的次数
static int i=0;//纯粹为了方便
static int j=0;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();//接收有几行数字
int[][] nums=new int[num][num]; //进行储存数字
for (int i2 = 0; i2 < num; i2++) {
for (int j2 = 0; j2 <= i2; j2++) {
nums[i2][j2]=sc.nextInt();
}
}
int mac=nums[0][0];//储存第一行的值
int[][] book=new int[num][num];//进行标记
int[][] sign=new int[num][num];//用来重置需要重置的标记
int[][] key=new int[num][num];//判断上一次是向左加还是向右加
dft(mac, book, nums, num, sign, key);
System.out.println(max);//输出最大值
}
public static void dft(int mac,int[][] book,int[][] nums,int num,int[][] sign,int[][] key) {
if (i==num-1) {
if (rignt==left||rignt==left-1||rignt==left+1) {
if (mac>max) {
max=mac;
}
}
}//判断完整的一次是否运行完,并对满足条件的情况储存最大值
if (j==num-1) {
return;
}//执行完最后一次,并输出
if (i+1<num&&(book[i+1][j]==0||book[i+1][j+1]==0)) {
if (book[i+1][j]==0) {
book[i+1][j]=1;
i++;
left++;//向左下
key[i][j]=1;
mac+=nums[i][j];//计算它们的和
dft(mac, book, nums, num,sign,key);//进入下一次运算
}//对运行过的点进行标记
else if(book[i+1][j+1]==0) {
book[i+1][j+1]=1;
i++;
j++;
rignt++;//向右下
key[i][j]=2;
mac+=nums[i][j];//计算它们的和
dft(mac, book, nums, num,sign,key);//进入下一次运算
}
}
else {
i--;//计算下一轮的值,进行后退
mac-=nums[i+1][j];
if (key[i+1][j]==2) {
j--;
rignt--;
}
else {
left--;
}//进行左右次数的计算
if (sign[i][j]==0) {//判断该标记是否需要重置
for (int c=i; c < num; c++) {
for (int k = j+1; k <= c; k++) {
book[c][k]=0;
}
}
sign[i][j]=1;//表示此标记已重置
}
dft(mac, book, nums, num,sign,key);//进行下一次计算
}
}
}
能力有限,请见谅