Luogu【P2904】跨河(DP)

题目链接在这里

此题DP。用一个前缀和一样的东西,把载i个奶牛的时间求出来,然后DP代码如下:

for(int i=1;i<=n;++i){
    f[i]=que[i];
    for(int j=0;j<i;++j)    f[i]=min(f[i],f[j]+que[i-j]);
}

这句话的意思是说,先载i头奶牛,然后从载0头到载i-1头寻找,看有没有更优解。如果有,那么更新。

最后输出的时候输出DP[n]-m,因为最后FJ是不用再回对岸的

放上代码

#include<cstdio>
#include<cstdlib>
#include<cctype>
using namespace std;

inline long long min(long long a,long long b){    return a<b?a:b;    }

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<<1)+(num<<3)+ch-'0';
        ch=getchar();
    }
    return num*f;
}

int que[1000000];
int f[1000000];

int main(){
    int n=read(),m=read();
    que[0]=m<<1;
    for(int i=1;i<=n;++i)    que[i]=que[i-1]+read();
    for(int i=1;i<=n;++i){
        f[i]=que[i];
        for(int j=0;j<i;++j)    f[i]=min(f[i],f[j]+que[i-j]);
    }
    printf("%d",f[n]-m);
    return 0;
}
原文地址:https://www.cnblogs.com/cellular-automaton/p/7061430.html