初始状态f[1]=0;f[2]=a[1][2];

对于每个i,有i-1个中转点j;(中转点可以为1,表示直接到达不进行中转)

这样,可以选择从1直接到达i,或从1到j,再从j到i。取两者最小值。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,f[250],r[250][250];
 6 int main(){
 7     scanf("%d",&n);
 8     for (int i=1;i<=n-1;i++){
 9         for (int j=i+1;j<=n;j++)
10             scanf("%d",&r[i][j]);
11         f[i]=100000001;
12     }
13     f[1]=0;f[2]=r[1][2];f[n]=100000001;
14     for (int i=3;i<=n;i++)
15         for (int j=1;j<i;j++)//从1循环  
16             f[i]=min(f[i],f[j]+r[j][i]);
17     printf("%d",f[n]);
18     return 0;
19 }
STD

 

posted on 2016-09-05 21:43  Absolutezero  阅读(162)  评论(0)    收藏  举报