【Luogu】P1594护卫队(前缀和+DP)

TM搞了半天的二维DP方程还是错的。

这是题目链接:

 设f[i]表示前i辆车顺利通过的最小时间。

则对于每一个i枚举该组车的起点j,然后从所有的f[j]+Min[j][i]中选一个最小的。

Min[j][i]表示从第j辆车到第i辆车最慢的是个什么速度。

#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
using namespace std;
inline long long read(){
    long long num=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')    f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        num=num*10+ch-'0';
        ch=getchar();
    }
    return num*f;
}

double f[1010];
long long Min[1010][1010];
long long ton[10000];
long long que[10000];
int main(){
    memset(Min,127/3,sizeof(Min));
    long long Max=read(),len=read(),n=read();
    for(int i=1;i<=n;++i){
        ton[i]=read()+ton[i-1];
        que[i]=read();
        for(int j=1;j<=i;++j){
            f[i]=0x7fffffff;
            Min[j][i]=min(Min[j][i-1],que[i]);
        }
    }
    for(int i=1;i<=n;++i){
        f[i]=f[i-1]+len*1.0/que[i];
        for(int j=i-1;j;--j){
            if(ton[i]-ton[j-1]>Max)    break;
            f[i]=min(f[i],f[j-1]+len*1.0/Min[j][i]);
        }
    }
    printf("%.1lf",f[n]*60);
    return 0;
}
原文地址:https://www.cnblogs.com/cellular-automaton/p/7518779.html