洛谷—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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章