数字三角形

数字三角形必须经过某一个点,使之走的路程和最大

输入格式:

第1行n,表示n行 (n<=25), 第2到n+1行为每个的权值,第n+2行为两个数x,y表示必须经过的点

输出格式:

输出最大值

样例1

输入:

2
1
1 1
1 1

输出:

2
//11 月 23 日 2015
#include <stdio.h>
int num[26][26];//存储数字三角形的权值                             
int route[26][2];//记录临时最优路径                              
int n;
int s1,s2;//以特殊点分为上半段和下半段,分别求其最大值数字三角形
int f;
int x,y;
void UpBacktrack(int i,int j)
{
    int k;
    if(i == 0)
    {
        f = 0;
        for(k=1;k<x;k++)
            f += num[route[k][0]][route[k][1]];
        if(f > s1)
            s1 = f;
        return;
    }
    else{
        //记录路径
        route[i][0] = i;
        route[i][1] = j;
    }
    if(j == 1)
        UpBacktrack(i-1,j);
    else if(j == i){
        UpBacktrack(i-1,j-1);
    }
    else{
        for(k=0;k<=1;k++)//2叉
            UpBacktrack(i-1,j-k);
    }
}
void DownBacktrack(int i,int j)
{
    int k;
    if(i > n)
    {
        f = 0;
        for(k=x+1;k<=n;k++)
            f += num[route[k][0]][route[k][1]];
        if(f > s2)
            s2 = f;
        return;
    }
    else{
        //记录路径
        route[i][0] = i;
        route[i][1] = j;
    }
    for(k=0;k<=1;k++)//2叉
        DownBacktrack(i+1,j+k);
}
int main()
{
    int i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
        for(j=1;j<=i;j++)
            scanf("%d",&num[i][j]);
    scanf("%d%d",&x,&y);
    //从特定点开始向上和向下回溯,保证两次回溯都得到最大路径权值
    UpBacktrack(x,y);
    DownBacktrack(x,y);
    printf("%d
",s1+s2+num[x][y]);//加上必须经过的点的权值
    return 0;
}
数字三角形
数字三角形