a[i][j]=a[i][j-1]+r[i][j-1]; printf(\
所求左上角顶点到右下角顶点的最大路程即最优值为a(n,m)。
6-4 求解边数值三角形的最短路径
已知边数值三角形每两点间距离如图7-4所示,每一个点可向左或向右两个去向,求三角形顶点到底边的最短路径。
图7-4 三角形边数值数据
1) 算法设计
设边数值三角形为n行(不包含作为边终止点的三角形底边),每点为(i,j),i=1,2,……,n;j=1,2,……,i.从点(i,j)向左的边长记为l(i,j),点(i,j)向右的边长记为r(i,j)。记a(i,j)为点(i,j)到底边的最短路程。显然
a(i,j)=min(a(i+1,j)+l(i,j),a(i+1,j+1)+r(i,j)) st(i,j)={‘l’,’r’}
应用逆推求解,所求的顶点A到底边的最短路程为a(1,1). 2) 边数值三角形最短路径搜索C程序设计 // 边数值三角形最短路径搜索 #include \#include
void main()
{ int n,i,j,t,s;
int a[50][50],l[50][50],r[50][50];char st[50][50];
t=time()00;srand(t); // 随机数发生器初始化 printf(\请输入数字三角形的行数n:\ scanf(\
for(i=1;i {for(j=1;j<=37-4*i;j++) printf(\ for(j=1;j<=i;j++) printf(\ for(j=1;j<=36-4*i;j++) printf(\ for(j=1;j<=i;j++) {l[i][j]=rand()/1000+1;printf(\ r[i][j]=rand()/1000+1;printf(\ printf(\ for(j=1;j<=37-4*(n+1);j++) printf(\ for(j=1;j<=n+1;j++) printf(\printf(\底边\\n\\n\ for(i=n;i>=1;i--) // 逆推求取最短路径 {for(j=1;j<=i;j++)