机房外面运动会,机房里面刷水题。。。
记录一个代价前缀和,直接dp即可。
注意:最后的答案要减去一次单人过河的代价,因为最后一次过河不用返程。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=2504;
int s[MAXN],dp[MAXN];
int n;
inline int read() {
int x=0;char c=getchar();
while (c<'0'||c>'9') c=getchar();
while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x;
}
int main() {
// freopen("bzoj 1617.in","r",stdin);
n=read(),s[0]=read();
for (int i=1;i<=n;++i) s[i]=s[i-1]+read();
for (int i=1;i<=n;++i) {
dp[i]=s[i]+s[0];
for (int j=0;j<i;++j)
dp[i]=min(dp[i],dp[j]+s[i-j]+s[0]);
}
printf("%d\n",dp[n]-s[0]);//最后一次不用返程
return 0;
}