動態規劃研究的問題與分治法區別:動態規劃的子問題不是相互獨立的,而是有交集,即子問題相互重疊,為了避免重複計算重疊的子問題,所以選擇從底向上的迭代,以後用到直接查表。從而將裝配線調度的複雜度從O(2^n)降到了O(n)。
代碼如下:
#include <iostream>using namespace std;void FastestWay(int (*a)[7],int (*t)[7],int *e,int *x,int n,int (*f)[7],int (*l)[7],int &ff,int &ll){f[0][1]=e[0]+a[0][1];f[1][1]=e[1]+a[1][1];for(int j=2;j<=n;j++){if(f[0][j-1]+a[0][j]<f[1][j-1]+t[1][j-1]+a[0][j]){f[0][j]=f[0][j-1]+a[0][j];l[0][j]=1;}else{f[0][j]=f[1][j-1]+t[1][j-1]+a[0][j];l[0][j]=2;}if(f[1][j-1]+a[1][j]<f[0][j-1]+t[0][j-1]+a[1][j]){f[1][j]=f[1][j-1]+a[1][j];l[1][j]=2;}else{f[1][j]=f[0][j-1]+t[0][j-1]+a[1][j];l[1][j]=1;}}if(f[0][n]+x[0]<f[1][n]+x[1]){ff=f[0][n]+x[0];ll=1;}else{ff=f[1][n]+x[1];ll=2;}}void PrintStations(int (*l)[7],int i,int j){if(j==1){cout<<"line "<<i<<" ,station "<<j<<endl;}else{int ti=i;i=l[i-1][j];int tj=j;j--;PrintStations(l,i,j);cout<<"line "<<ti<<" ,station "<<tj<<endl;}}int main(){int n=6;int a[2][7]={{0,7,9,3,4,8,4},{0,8,5,6,4,5,7}};int t[2][7]={{0,2,3,1,3,4},{0,2,1,2,2,1}};int e[2]={2,4};int x[2]={3,2};int f[2][7],l[2][7];int ff=0,ll=0;FastestWay(a,t,e,x,n,f,l,ff,ll);PrintStations(l,ll,6);//cout<<ff<<" "<<ll;system("pause");}