• Codeforces 596D Wilbur and Trees dp (看题解)


    一直在考虑, 每一段的贡献, 没想到这个东西能直接dp。。因为所有的h都是一样的。

    #include<bits/stdc++.h>
    #define LL long long
    #define fi first
    #define se second
    #define mk make_pair
    #define PLL pair<LL, LL>
    #define PLI pair<LL, int>
    #define PII pair<int, int>
    #define SZ(x) ((int)x.size())
    #define ull unsigned long long
    
    using namespace std;
    
    const int N = 2000 + 7;
    const int inf = 0x3f3f3f3f;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const int mod = 1e9 + 7;
    const double eps = 1e-8;
    const double PI = acos(-1);
    
    int n, h, x[N], lft[N], rgt[N];
    double ans, p, pr, pl;
    double f[N][N][2][2];
    bool vis[N][N][2][2];
    
    double dp(int i, int j, int u, int v) {
        if(i > j) return 0;
        if(vis[i][j][u][v]) return f[i][j][u][v];
        double& ans = f[i][j][u][v];
        double tmp1 = 0, tmp2 = 0;
        if(!u) ans += 0.5 * pl * (dp(i + 1, j, 0, v) + min(h, x[i] - x[i - 1])), tmp1 = min(h, x[i] - x[i - 1]);
        else ans += 0.5 * pl * (dp(i + 1, j, 0, v) + min(h, x[i] - x[i - 1] - h)), tmp1 = min(h, x[i] - x[i - 1] - h);
        if(v) ans += 0.5 * pr * (dp(i, j - 1, u, 1) + min(h, x[j + 1] - x[j])), tmp2 = min(h, x[j + 1] - x[j]);
        else ans += 0.5 * pr * (dp(i, j - 1, u, 1) + min(h, x[j + 1] - h - x[j])), tmp2 = min(h, x[j + 1] - h - x[j]);
        int L = min(rgt[i], j), R = max(lft[j], i);
        ans += 0.5 * pr * (dp(L + 1, j, 1, v) + x[L] - x[i] + (L != j ? h : tmp2));
        ans += 0.5 * pl * (dp(i, R - 1, u, 0) + x[j] - x[R] + (R != i ? h : tmp1));
        vis[i][j][u][v] = true;
        return ans;
    }
    
    int main() {
        scanf("%d%d%lf", &n, &h, &p);
        pl = p, pr = 1 - p;
        for(int i = 1; i <= n; i++) scanf("%d", &x[i]);
        x[0] = -inf, x[n + 1] = inf;
        sort(x + 1, x + 1 + n);
        lft[1] = 1, rgt[n] = n;
        for(int i = 2; i <= n; i++)
            lft[i] = x[i] - h < x[i - 1] ? lft[i - 1] : i;
        for(int i = n - 1; i >= 1; i--)
            rgt[i] = x[i] + h > x[i + 1] ? rgt[i + 1] : i;
        printf("%.10f
    ", dp(1, n, 0, 1));
        return 0;
    }
    
    /*
    */
  • 相关阅读:
    Mysql:存储过程
    mysql-8.0.21的安装
    java8:四大函数式接口(Consumer、Supplier、Function、Predicate)
    java8:Lambda表达式、函数式接口
    Nginx:负载均衡
    JeecgBoot:开发环境准备(安装Node.js、yarn、WebStorm、Nodejs镜像)
    Nginx:反向代理(案例)
    Mysql:性能分析
    Nginx:初识Nginx(概念、在Docker中安装Nginx、常用命令、配置文件)
    Docker 实战之Registry以及持续集成
  • 原文地址:https://www.cnblogs.com/CJLHY/p/10512296.html
Copyright © 2020-2023  润新知