题目大意:过桥问题
我们考虑利用时间最小的两个人倒运,把时间大的人依次送过去
有两种方式:
1.时间最小的人和时间最大的人过去,然后时间最小的人把火把拿回来
2.时间最小和第二小的两个人过去,然后时间最小的人把火把拿回来;接着时间最大和第二大的两个人过去,时间第二小的人把火把拿回来
为了保证最优 运输应该不外乎这两种形式
那么令f[i]表示当前没有过桥的人还剩i个时的最短时间 DP即可
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 100100 using namespace std; int n,a[M]; long long f[M]; int main() { int i; cin>>n; for(i=1;i<=n;i++) scanf("%d",&a[i]); if(n<=2) return cout<<a[n]<<endl,0; for(i=n-1;i>=2;i--) { f[i]=f[i+1]+a[1]+a[i+1]; if(i<=n-2) f[i]=min(f[i],f[i+2]+a[2]+a[1]+a[i+2]+a[2]); } cout<<f[2]+a[2]<<endl; return 0; }
时间: 2024-11-01 17:16:30