题目链接:https://vjudge.net/problem/Gym-101490D
题目大意:
由一个桥,有n艘船需要从桥下面过去,对于桥来说,桥升起来需要60秒,降下去需要60秒,对于每艘船来说,必须等到桥完全升起才能通过,通过时间是20秒,如果桥此刻没有升起来,船最多只能等3分钟,就必须走了。桥上面是通汽车的,桥没有完全落下时,汽车是不能走的,现在告诉你每搜船到达的时间,现在问你汽车一定不能通行的时间是多少
思路概括:
每搜船分为两种情况,要么这艘船单独溜,要么就是跟其他船一起溜,那么对于第i搜船来说,是由前面的状态决定的,也就是说,要么是第i-1艘船走完的时间加上这艘船单独走的时间,要么就是,枚举从第几艘船开始和第i艘一起溜的在加上这艘船溜的时间。对于一起走的情况又分为两种,像第二个样例,第一艘船,等到1900s就必须走了,然后桥一直升着,要么就是可以艘船都可以等到同一个时间点走
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
#include<cassert>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<deque>
#include<iomanip>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
using namespace std;
typedef long long ll;
#define int ll
const double pi = acos(-1.0);
const ll mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const int maxn = 4e4 + 50;
int a[maxn];
int dp[maxn];
signed main()
{
int n;
while(cin >> n)
{
memset(dp, inf, sizeof(dp));
for(int i=1; i<=n; i++)
{
cin >> a[i];
}
dp[0] = 0;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=i; j++)
{
dp[i] = min(dp[i], dp[j-1] + max((i - j + 1) * 20 + 120, a[i] - a[j] - 1800 + 140));
}
}
cout << dp[n] << endl;
}
return 0;
}