Description
Input
Output
Sample Input
6
40 200 1 300 2 10
Sample Output
1950
Data Constraint
Hint
思路
区间DP
设g[i][j]区间(i,j)为只转弯一次的死去最少人数,区间dp即可
设f[i]为1到i死去最少人数。
可以发现,对于一段路,它最多走三次,所以不用统计时间
代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=3077;
long long n,a[maxn],g[maxn][maxn],f[maxn],s[maxn];
int main()
{
scanf("%lld",&n);
for(int i=1; i<=n; i++) scanf("%lld",&a[i]),s[i]=s[i-1]+a[i],g[i][i]=0;
for(int k=2; k<=n; k++)
{
for(int i=1; i<=n; i++)
{
int j=i+k-1;
if(j>n) break;
g[i][j]=g[i+1][j]+s[j]-s[i]+min(s[j]-s[i],(j-i)*3*a[i]);
}
}
for(int i=1; i<=n; i++)
{
f[i]=g[1][i]+(i*4-2)*(s[n]-s[i]);
for(int j=1; j<i; j++)
f[i]=min(f[i],f[j]+g[j+1][i]+((i-j)*4-2)*(s[n]-s[i]));
}
printf("%lld",f[n]);
}