洛谷—P1809 过河问题(经典动态规划问题)

在这里插入图片描述

解题思路:
这一题运用的是贪心思想,不能想出,每一步的最优解存在于两种方案中,第一种是过河最短时间的人开船过来,接走一个过河时间最长的人再开船返回。第二种是过河时间最短的人开船过来,他留下,让当前两个最长过河时间的人乘船过岸,然后再让对岸最短过河时间的人开船过河将他接回。
令dp[i]为将前i个人运送过河所需要的最短时间,再列出状态转移方程

代码:

#include<bits/stdc++.h>
using namespace std;
int n,arr[100010],dp[100010];
int main()
{
	cin>>n;
	for(int i=1;i<=n;++i)
	cin>>arr[i];
	sort(arr+1,arr+1+n);
	dp[1]=arr[1];
	dp[2]=arr[2];
	for(int i=3;i<=n;++i)
	dp[i]=min(dp[i-1]+arr[1]+arr[i],dp[i-2]+arr[1]+arr[i]+2*arr[2]);
	cout<<dp[n]<<endl;
	return 0;
}
发布了165 篇原创文章 · 获赞 11 · 访问量 4885

猜你喜欢

转载自blog.csdn.net/weixin_43784305/article/details/104564688
今日推荐