这是一个最坏情况n^2,但本机各种随机数据测试都接近o(n)的时间,HDU,POJ,BZOJ上运行时间也只是该题最短时间的两三倍,而且1e6数据还没开读入挂。
但是只是随机数据下接近线性,但是如果故意造数据,随便卡。
BZOJ 3437: 时限10s
POJ 1180: 时限1s
HDU3507: 时限1s
这样写的前提是,x变量随着r单调递增。
以后这类题可以前莽一发试试。
代码就是最脑残的暴力
//bzoj3437
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll A[N],B[N],F[N],P[N],S[N],DP[N];
int main(){
//freopen("1.in","r",stdin);
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%lld",&A[i]);
for(int i=1;i<=n;++i)scanf("%lld",&B[i]),B[i]+=B[i-1];
P[0]=1;
for(int i=1;i<=n;++i){
F[i]=F[i-1]+B[i-1];
}
for(int i=1;i<=n;++i){
DP[i]=F[i]+A[i];
for(int j=S[i-1];j<i;++j){
if(DP[i]>=DP[j]+F[i]-F[j]-B[j]*(i-j)+A[i]){
DP[i]=DP[j]+F[i]-F[j]-B[j]*(i-j)+A[i];
S[i]=j;
}
}
}
printf("%lld\n",DP[n]);
}