【题目描述】
下图表示城市之间的交通路网,线段上的数字表示费用,单向通行由A->E。试用动态规划的最优化原理求出A->E的最省费用。
如图:求v1到v10的最短路径长度及最短路径。
【输入】
第一行为城市的数量N;
后面是N*N的表示两个城市间费用组成的矩阵。
【输出】
A->E的最省费用。
【输入样例】
10 0 2 5 1 0 0 0 0 0 0 0 0 0 0 12 14 0 0 0 0 0 0 0 0 6 10 4 0 0 0 0 0 0 0 13 12 11 0 0 0 0 0 0 0 0 0 0 3 9 0 0 0 0 0 0 0 0 6 5 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0
【输出样例】
minlong=19 1 3 5 8 10
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int main(){ 6 long n,i,j,x,f[100],c[100],a[100][100]; 7 memset(a,0,sizeof(a)); 8 memset(c,0,sizeof(c)); 9 cin>>n; 10 for(i=1;i<=n;i++) 11 for(j=1;j<=n;j++) cin>>a[i][j]; 12 for(i=1;i<=n;i++) f[i]=1000000; 13 f[n]=0; 14 for(i=n-1;i>=1;i--) 15 for(x=i+1;x<=n;x++) 16 if((a[i][x]>0)&&(f[x]!=1000000)&&(f[i]>a[i][x]+f[x])){ 17 f[i]=a[i][x]+f[x]; 18 c[i]=x; 19 } 20 cout<<"minlong="<<f[1]<<endl; 21 x=1; 22 while(x!=0){ 23 cout<<x<<" "; 24 x=c[x]; 25 } 26 return 0; 27 }
最近一段时间先练练dp,
主要是背包,
没办法,
我太菜了,
需要时间的磨炼qwq。
好,
一道简单又基础的dp,
我就不多说了,
我这种蒟蒻都会的,
也不指望有谁不会qwq