12届 蓝桥杯B组D题最短路径 dp解法

在这里插入图片描述
这个题虽然是个模板题,但是用dp的话更快
解题思路:首先作为一个dp题我们必须要求出他的状态转移方程
在我们读懂题意后不难得出他的方程是dp[i]=min(dp[i],dp[i-j]+最小公倍数(i,i-j))
方程出来后我们就应该在数组上铺一层数让他可以滚动起来;
首先我们可以保证1-22的最短路径就是他本身。其次我们可以先假设每个数字的最短路径是他本身-21。然后在从一到二十一依次试;
代码如下:

在这里插入代码片
#include<stdio.h>
int A[10000];
int min(int i, int  n) {
	return i < n ? i : n;
}
int qwe(int i, int n)//最小公倍数的函数
{
	int t, k, l;
	t = i > n ? i : n;
	k = i < n ? i : n;
	while (k)
	{
		l = t % k;
		t = k;
		k = l;
	}
	return (i * n) / t;
}
int main() {
	int i, j;
	for (i = 1;i <= 22;i++) A[i] = i;
	for (i = 23;i <= 2021;i++){
		A[i] = qwe(i, i - 21)+A[i-21];//先铺一层最长的路径
	}
	for (i =23;i<=2021;i++) {
		for (j = 1;j <= 21;j++) {//从一到21开始试,得出最短路径,只有保证前面是对的,才能得出后面的解
			A[i] = min(A[i], A[i-j] + qwe(i,i-j));

		}
	}
	printf("%d\n", A[2021]);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值