zoukankan      html  css  js  c++  java
  • [Luogu2991][USACO10OPEN]水滑梯Water Slides

    题面戳我
    题面描述
    受到秘鲁的马丘比丘的新式水上乐园的启发,Farmer John决定也为奶牛们建一个水上乐园。当然,它最大的亮点就是新奇巨大的水上冲浪。
    超级轨道包含 E (1 <= E <=150,000)条小轨道连接着V (V <= 50,000)个水池,编号为1..V。每个小轨道必须按照特定的方向运行,不能够反向运行。奶牛们从1号水池出发,经过若干条小轨道,最终到达V号水池。每个水池(除了V号和1号之外,都有至少一条小轨道进来和一条小轨道出去,并且,一头奶牛从任何一个水池到达V号水池。最后,由于这是一个冲浪,从任何一个水池出发都不可能回到这个水池)
    每条小轨道从水池P_i到水池Q_i (1 <= P_i <= V; 1<= Q_i <= V; P_i != Q_i),轨道有一个开心值F_i (0 <= F_i <=2,000,000,000),Bessie总的开心值就是经过的所有轨道的开心值之和。
    Bessie自然希望越开心越好,并且,她有足够长的时间在轨道上玩。因此,她精心地挑选路线。但是,由于她是头奶牛,所以,会有至多K (1 <= K <= 10)次的情况,她无法控制,并且随机从某个水池选择了一条轨道(这种情况甚至会在1号水池发生)
    如果Bessie选择了在最坏情况下,最大化她的开心值,那么,她在这种情况下一次冲浪可以得到的最大开心值是多少?
    输入输出格式
    输入格式:
    Line 1: Three space separated integers: V, E, and K
    Lines 2..E + 1: Line i+1 contains three space separated integers: P_i, Q_i, and F_i
    输出格式:
    Line 1: A single line with a single integer that is the minimum fun that Bessie can guarantee she can have.
    输入输出样例
    输入样例#1:

    3 4 1 
    2 3 5 
    1 2 5 
    1 3 9 
    2 3 3 
    

    输出样例#1:

    9 
    

    题解

    DP+记搜转移。
    记dp[k][u]表示现在在u点至多还会发生k次错误,到达终点的最大开心值之和。转移:(设v表示u能够到达的点,len(u,v)表示两点间的)
    dp[k][u]=max(dp[k][v]+len(u,v));//没出故障
    dp[k][u]=min(dp[k-1][v]+len(u,v));//出了故障
    最终的结果既然是最坏情况下就应该是两式结果取min,注意当k=0时就没有第二个表达式了。
    最终答案为dpK,边界条件是dp[0..K][n]=0。

    code

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define ll long long
    const int N = 50005;
    const int M = 150005;
    struct edge{int to,next;ll w;}a[M];
    int n,m,K,u,v,head[N],cnt;
    ll w,dp[11][N];
    ll dfs(int k,int u)
    {
        if (dp[k][u]) return dp[k][u];
        for (int e=head[u];e;e=a[e].next)
            dp[k][u]=max(dp[k][u],dfs(k,a[e].to)+a[e].w);
        if (k)
            for (int e=head[u];e;e=a[e].next)
                dp[k][u]=min(dp[k][u],dfs(k-1,a[e].to)+a[e].w);
        return dp[k][u];
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&K);
        for (int i=1;i<=m;i++)
            scanf("%d%d%lld",&u,&v,&w),a[++cnt]=(edge){v,head[u],w},head[u]=cnt;
        return printf("%lld
    ",dfs(K,1)),0;
    }
    
  • 相关阅读:
    Hanoi塔
    采药
    进制转换(大数)
    Load Balancing with NGINX 负载均衡算法
    upstream模块实现反向代理的功能
    epoll
    在nginx启动后,如果我们要操作nginx,要怎么做呢 别增加无谓的上下文切换 异步非阻塞的方式来处理请求 worker的个数为cpu的核数 红黑树
    粘性会话 session affinity sticky session requests from the same client to be passed to the same server in a group of servers
    负载均衡 4层协议 7层协议
    A Secure Cookie Protocol 安全cookie协议 配置服务器Cookie
  • 原文地址:https://www.cnblogs.com/zhoushuyu/p/8167575.html
Copyright © 2011-2022 走看看