码迷,mamicode.com
首页 > 其他好文 > 详细

数字三角形

时间:2015-12-30 23:58:20      阅读:346      评论:0      收藏:0      [点我收藏+]

标签:

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

输入格式:

第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\n",s1+s2+num[x][y]);//加上必须经过的点的权值
    return 0;
}
技术分享

 

技术分享

数字三角形

标签:

原文地址:http://www.cnblogs.com/520xiuge/p/5090270.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!