初始状态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 }
浙公网安备 33010602011771号