![](https://img-blog.csdnimg.cn/d3c2687cb6cb4e35afe4d774b235e87f.png)
![](https://img-blog.csdnimg.cn/c5aec3aa7a6041a19279c1976948e0a8.png)
这道题输入的时候要注意判断a是不是0
f [ i ] [ j ] 表示第i等级的第j号星球 存的是最小路费
这个状态如何得到呢
只要遍历上一个等级 也就是 i - 1 级的所有星球 将到达i - 1级的星球的路费 加上 该星球到现在所求星球的这段距离的路费 求这一系列路费当中最小的一个
所以在dp之前也必须给所有f [ i ] [ j ] 初始化赋上一个极大值 才能保证 至少得有一条路是能走到目标等级的 不然如果 f [ i ] [ j ] 的状态一直不被更新 那就一直是与i - 1 级的星球断开连接的状态
最后找出最高等级星球中最省钱的一个就行
#include <bits/stdc++.h>
using namespace std;
int f[105][105];
int ANS = 100000; //给答案赋个最大值先
int N,K;
int a,b; //a是上个等级星球的编号,b是路费
int main()
{
scanf("%d", &N);
for(int i = 1; i <= N; i ++)
{
scanf("%d",&K);
for(int j = 1; j <= K; j ++)
{
f[i][j] = 100000; //给初始化一下
while(cin >> a)
{
if(!a) break; //零号直接退出去搞下一行
cin >> b;
f[i][j] = min(f[i][j], f[i-1][a] + b);
}
}
}
for(int j = 1; j <= K; j ++)
{
ANS = min(f[N][j], ANS); //在最高等级的星球里面找一个最省钱的
}
printf("%d", ANS);
return 0;
}