您的位置:首页 > 其它

数字三角形

2015-12-30 22:41 344 查看
数字三角形必须经过某一个点,使之走的路程和最大

输入格式:

第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;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: