先看第5阶段,到达A点有两条路
– B A , 需要2km
– C A , 需要3km
令
– 从P A 的最短路径为P(A) ;
– 从P B的最短路径为P(B);
– 从P C 的最短路径为P(C) ……
– P(A) = min{P(B)+2, P(C)+3} ;
– P(B) = min{P(D)+1, P(E)+2} ;
– P(C) = min{P(E)+5, P(F)+4} ;
P(A) = min{P(B)+2, P(C)+3};
P(B) = min{P(D)+1, P(E)+2};
P(C) = min{P(E)+5, P(F)+4};
P(N) = 2;
P(O) = 3;
选择数据结构,将每条路经的长度存在数组中。
东西方向上的道路长度存在两维数组h[4][3]中规定数组的第一维为行号,第二维为列号。
南北方向上道路长度存至数组v[3][4]中,也规定第一维为行号,第二维为列号。
为了计算方便,将图1改为图2
– 求解过程为从(0, 0)到(3, 3)求最短路径问题
定义二维数组,P[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}},第一维为行,第二维为列。这时P(O)为P[0][1];P(N)为P[1][0];…P(A)为P[3][3],以下为分阶段递推求解过程。
P[0][0] = 0;
对于阶段1:
P[0][1] = P[0][0]+h[0][0] = 0+3 = 3;
P[1][0] = P[0][0]+v[0][0] = 0+2 = 3;
对于阶段2
P[1][1] = min{ P[0][1]+v[0][1], P[1][0]+h[1][0]}
= min{3+1, 2+2} = 4
P[0][2] = P[0][1]+h[1][0] = 3+2 = 5
P[2][0] = P[1][0]+v[1][0] = 2+4 = 6
对于阶段3
P[1][2] = min{ P[0][2]+v[0][2], P[1][1]+h[1][1]}
= min{5+3, 4+1} = 5
P[0][3] = P[0][2]+h[0][2] = 5+3 = 8
P[2][1] = min{ P[1][1]+v[1][1], P[2][0]+h[2][0]}
= min{4+1, 6+1} = 5
P[3][0] = P[2][0]+v[2][0] = 6+1 = 7
对于阶段4
P[1][3] = min{ P[0][3]+v[0][3], P[1][2]+h[1][2]}
= min{8+4, 5+4} = 9
P[2][2] = min{ P[1][2]+v[1][2], P[2][1]+h[2][1]}
= min{5+2, 5+4} = 7
P[3][1] = min{ P[2][1]+v[2][1], P[3][0]+h[3][0]}
= min{5+2, 7+3} = 7
对于阶段5
P[2][3] = min{ P[1][3]+v[1][3], P[2][2]+h[2][2]}
= min{9+4, 7+5} = 12
P[3][2] = min{ P[2][2]+v[2][2], P[3][1]+h[3][1]}
= min{7+2, 7+1} = 8
最后
P[3][3] = min{ P[2][3]+v[2][3], P[3][2]+h[3][2]}
= min{12+3, 8+2} = 10
综上,数组P的通项表示为
P[i][j]= min( ( p[i-1][j]+v[i-1][j]), (p[i][j-1]+h[i][j-1]) ) (i, j>0)
P[0][j]=P[0][j-1]+h[0][j-1] ( i=0, j>0)
P[i][0]=P[i-1][0]+v[i-1][0] ( i>0, j=0)
下面给出P数组中的数据
数组P的通项表示为
P[i][j]= min( ( p[i-1][j]+v[i-1][j]),
(p[i][j-1]+h[i][j-1]) ) (i, j>0)
P[0][j]=P[0][j-1]+h[0][j-1] ( i=0, j>0)
P[i][0]=P[i-1][0]+v[i-1][0] ( i>0, j=0)
• 画出用动态规划思想求出的各个路口对P点的最小距离。图中圆圈里就是这个距离。箭头表示所寻得的最佳行走路径。(图3)
for j:=1 to 4 do p[0][j]=p[0][j-1]+h[0][j-1]; {计算0行上的每点的距离}
For i:=1 to 4 do p[i][0]=p[i-1][0]+v[i-1][0]; {计算0列上的每点的距离}
for j:=1 to 4 do p[0][j]=p[0][j-1]+h[0][j-1]; {计算0行上的每点的距离}
For i:=1 to 4 do p[i][0]=p[i-1][0]+v[i-1][0]; {计算0列上的每点的距离}
for i:=1 to 4 do
for j:=1 to 4 do p[i][j]=min( ( p[i-1][j]+v[i-1][j]), (p[i][j-1]+h[i][j-1]) );
For i:=3 downto 0 do {输出每个路口对P点的最小距离}
begin
for j:=0 to 3 do write(p[i][j]:4)
writeln;
End;
– B A , 需要2km
– C A , 需要3km
令
– 从P A 的最短路径为P(A) ;
– 从P B的最短路径为P(B);
– 从P C 的最短路径为P(C) ……
– P(A) = min{P(B)+2, P(C)+3} ;
– P(B) = min{P(D)+1, P(E)+2} ;
– P(C) = min{P(E)+5, P(F)+4} ;
P(A) = min{P(B)+2, P(C)+3};
P(B) = min{P(D)+1, P(E)+2};
P(C) = min{P(E)+5, P(F)+4};
P(N) = 2;
P(O) = 3;
选择数据结构,将每条路经的长度存在数组中。
东西方向上的道路长度存在两维数组h[4][3]中规定数组的第一维为行号,第二维为列号。
南北方向上道路长度存至数组v[3][4]中,也规定第一维为行号,第二维为列号。
为了计算方便,将图1改为图2
– 求解过程为从(0, 0)到(3, 3)求最短路径问题
定义二维数组,P[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}},第一维为行,第二维为列。这时P(O)为P[0][1];P(N)为P[1][0];…P(A)为P[3][3],以下为分阶段递推求解过程。
P[0][0] = 0;
对于阶段1:
P[0][1] = P[0][0]+h[0][0] = 0+3 = 3;
P[1][0] = P[0][0]+v[0][0] = 0+2 = 3;
对于阶段2
P[1][1] = min{ P[0][1]+v[0][1], P[1][0]+h[1][0]}
= min{3+1, 2+2} = 4
P[0][2] = P[0][1]+h[1][0] = 3+2 = 5
P[2][0] = P[1][0]+v[1][0] = 2+4 = 6
对于阶段3
P[1][2] = min{ P[0][2]+v[0][2], P[1][1]+h[1][1]}
= min{5+3, 4+1} = 5
P[0][3] = P[0][2]+h[0][2] = 5+3 = 8
P[2][1] = min{ P[1][1]+v[1][1], P[2][0]+h[2][0]}
= min{4+1, 6+1} = 5
P[3][0] = P[2][0]+v[2][0] = 6+1 = 7
对于阶段4
P[1][3] = min{ P[0][3]+v[0][3], P[1][2]+h[1][2]}
= min{8+4, 5+4} = 9
P[2][2] = min{ P[1][2]+v[1][2], P[2][1]+h[2][1]}
= min{5+2, 5+4} = 7
P[3][1] = min{ P[2][1]+v[2][1], P[3][0]+h[3][0]}
= min{5+2, 7+3} = 7
对于阶段5
P[2][3] = min{ P[1][3]+v[1][3], P[2][2]+h[2][2]}
= min{9+4, 7+5} = 12
P[3][2] = min{ P[2][2]+v[2][2], P[3][1]+h[3][1]}
= min{7+2, 7+1} = 8
最后
P[3][3] = min{ P[2][3]+v[2][3], P[3][2]+h[3][2]}
= min{12+3, 8+2} = 10
综上,数组P的通项表示为
P[i][j]= min( ( p[i-1][j]+v[i-1][j]), (p[i][j-1]+h[i][j-1]) ) (i, j>0)
P[0][j]=P[0][j-1]+h[0][j-1] ( i=0, j>0)
P[i][0]=P[i-1][0]+v[i-1][0] ( i>0, j=0)
下面给出P数组中的数据
数组P的通项表示为
P[i][j]= min( ( p[i-1][j]+v[i-1][j]),
(p[i][j-1]+h[i][j-1]) ) (i, j>0)
P[0][j]=P[0][j-1]+h[0][j-1] ( i=0, j>0)
P[i][0]=P[i-1][0]+v[i-1][0] ( i>0, j=0)
• 画出用动态规划思想求出的各个路口对P点的最小距离。图中圆圈里就是这个距离。箭头表示所寻得的最佳行走路径。(图3)
for j:=1 to 4 do p[0][j]=p[0][j-1]+h[0][j-1]; {计算0行上的每点的距离}
For i:=1 to 4 do p[i][0]=p[i-1][0]+v[i-1][0]; {计算0列上的每点的距离}
for j:=1 to 4 do p[0][j]=p[0][j-1]+h[0][j-1]; {计算0行上的每点的距离}
For i:=1 to 4 do p[i][0]=p[i-1][0]+v[i-1][0]; {计算0列上的每点的距离}
for i:=1 to 4 do
for j:=1 to 4 do p[i][j]=min( ( p[i-1][j]+v[i-1][j]), (p[i][j-1]+h[i][j-1]) );
For i:=3 downto 0 do {输出每个路口对P点的最小距离}
begin
for j:=0 to 3 do write(p[i][j]:4)
writeln;
End;