如何从动态编程技术开始打印最佳路径

时间:2011-06-12 08:06:06

标签: c algorithm data-structures

下面是包含+ ve和-ve数字的数组的标准maxsum的代码。我认为,以下程序的工作正确。 Bot如何打印最佳路径? 通过保持指向最佳父级的指针,我可以轻松地向后打印路径,但是如何以向前方向打印它,最好不要保留太多额外的簿记。

#include <stdio.h>

main()
{
    int array[]={5,-5,3,4,-2};
    int n=5;
    int i;
    int maxsumendingat[n];
    int parent[n];
    int maxsum=-9999; // better way to code?
    int optimallastindex;

    maxsumendingat[0]=array[0];

    for(i=1;i<n;i++)
    {
       if(maxsumendingat[i-1] <= 0)

       { 
           maxsumendingat[i]=array[i]; 
           parent[i]=i; 
       }
      else
      { 
           maxsumendingat[i]=array[i]+maxsumendingat[i-1];  // also keep backtracking info
           parent[i]=i-1;
      }
    }

     // now print results
    for(i=0;i<n;i++) 
    {
      if(maxsum < maxsumendingat[i]) 
      { 
         maxsum=maxsumendingat[i]; 
         optimallastindex=i;
      }
    }

    // now print path. how to print it in fwd direction?
    i=optimallastindex;
    printf("%d ",array[i]);
    while(parent[i]!= i)
    {
        printf("%d ",array[parent[i]]);
        i=parent[i];

    }

}

2 个答案:

答案 0 :(得分:2)

只需将反转路径存储在临时数组中,然后向后迭代该数组。

答案 1 :(得分:1)

您只需在新数组(或堆栈)中复制父项,然后按向后顺序迭代数组,或者在else语句中执行next[i-1] = i而不是使用父级使用。