标签:
数字三角形必须经过某一个点,使之走的路程和最大
输入格式:
第1行n,表示n行 (n<=25), 第2到n+1行为每个的权值,第n+2行为两个数x,y表示必须经过的点
输出格式:
输出最大值
输入:
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