题:https://cn.vjudge.net/problem/Gym-101490D
每一只船通过有两种情况:
1、自己单独通过(吊起桥 +自己通过+ 落桥)。
2、和前面的一起同过(吊起桥+ 前面x个船通过+ 自己通过 + 落桥)
第二种情况又分为两类:
- 前面的船能等到他 然后吊桥+连续通过+ 落桥
- 前面的船等不到他 吊桥 +通过 + 不落桥+自到达通过+落桥
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 4e3+50;
int dp[maxn];
int a[maxn];
int main()
{
ios_base::sync_with_stdio(false);
int N;
cin>>N;
dp[0] = 0;
for(int i = 1;i <= N;i++)
{
cin>>a[i];
}
for(int i = 1;i <= N;i++)
{
int tmp = dp[i-1]+140;//单独通过 导致道路交通不能使用的时长
for(int j = 1;j < i;j++)// 和前面的一起过去
{
// 第一种情况 前面的船等不了该船了 第二种情况是能等到该船
tmp = min(tmp, dp[j-1]+max((a[i]-a[j]-1740-60) + 20, (i-j+1)*20)+60+60);
}
dp[i] = tmp;
}
cout<<dp[N]<<endl;
return 0;
}
// a[i] - a[j]-1740-60 +20