题目弹射机:租用游艇 - 洛谷
看完题后,你可以很快对输入进行判断:定义a[i][j]为从i->j的租金
然后就是激(suǒ)动(rán)人(wú)心(wèi)的推导转移方程的环节。
第一步:画1->3图
定义f[i]代表从i->n的最少租金
推出f[2]=a[2][3] ,f[1]=min(a[1][2]+a[2][3],a[1][3])
现在我们还是不知道方程是啥(除了某些大牛)
于是我们再次画一张1->4的图
发现:
f[3]=a[3][4]
f[2]=min(a[2][3]+a[3][4](这是f[3]),a[2][4])
f[1]=min(a[1][4],min(a[1][2]+min(a[2][3]+a[3][4](这是f[3]),a[2][4])(这是f[2]),a[1][3]+a[3][4](这是f3)))
看到这里……
恭喜你,已经可以编出程序了。
AC code:
#include <bits/stdc++.h> // 万能头文件
using namespace std;
int n, a[205][205], f[205];
// a存储i->j的租用租金
// f存储从i->n的最少使用租金
int main()
{
scanf("%d", &n);
for (int i = 1; i < n; i++) // 循环到n-1因为一共有n个租用站,而第n个租用站没有下游的租用站
for (int j = i + 1; j <= n; j++) // 输入从i+1到n的所有下游租用站的价格
scanf("%d", &a[i][j]);
memset(f, 0x3f, sizeof(f)); // 因为初始时,无法确定f[i]的值,所以都设为0x3f
f[n] = 0; // 从n->n不需要花费任何钱财
for (int i = n - 1; i >= 1; i--) // 从最下游开始枚举每一个点
for (int j = i + 1; j <= n; j++) // 枚举所有能到达的点
f[i] = min(f[i], a[i][j] + f[j]);
printf("%d", f[1]);
return 0;
}
给个赞再走吧!