zoukankan      html  css  js  c++  java
  • URAL 1143 Electric Path(带方向的区间DP + 记忆化搜索)

    题意:

    有 n 个点,他们正好形成一个凸多边形,从某个点开始,且只经过每个点一次,就最终的最短路径。

    黑书 133 面,烦恼的青蛙。差不多一样的题目。

    思路:

    1. 首先路径不能相交,只有不相交的情况下才能找到最短路径;

    2. dp[s, L, 0] 表示从 s 点出发,经过 L 个点,最终的最短路径,由 1 可以确定的是:这 L 个点肯定是相邻的;

        dp[s, L, 1] 表示从 s + L - 1 点出发,经过 L 个点,最终的最短路径;

    3. 上述可以理解成带方向的区间DP,比如区间为[0, n-1],因为路径不能相交,所以考虑是从 0 出发还是从 n-1 出发,然后逐步缩小区间,达到求解的目的;

    4. 如果从 1 出发,则只能访问 2 或者 n 才能达到最优,最终可以利用记忆化搜索完美解决;

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    const int MAXN = 210;
    double dis[MAXN][MAXN], x[MAXN], y[MAXN];
    double dp[MAXN][MAXN][2];
    int n;
    
    inline double getdist(int i, int j) {
        return sqrt((x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]));
    }
    
    double solvedp(int s, int l, int f) {
        if (dp[s][l][f] != 1e20)
            return dp[s][l][f];
    
        if (f == 0) {
            dp[s][l][0] = solvedp((s+1)%n, l-1, 0) + dis[s][(s+1)%n];
            dp[s][l][0] = min(dp[s][l][0], solvedp((s+1)%n, l-1, 1) + dis[s][(s+l-1)%n]);
        } else {
            dp[s][l][1] = solvedp(s, l-1, 1) + dis[(s+l-1)%n][(s+l-2)%n];
            dp[s][l][1] = min(dp[s][l][1], solvedp(s, l-1, 0) + dis[(s+l-1)%n][s]);
        }
        return dp[s][l][f];
    }
    
    int main() {
        while (~scanf("%d", &n)) {
            for (int i = 0; i < n; i++)
                scanf("%lf%lf", &x[i], &y[i]);
    
            for (int i = 0; i < n; i++)
                for (int j = i; j < n; j++)
                    dis[i][j] = dis[j][i] = getdist(i, j);
    
            for (int i = 0; i < n; i++)
                for (int j = 0; j <= n; j++)
                    dp[i][j][0] = dp[i][j][1] = 1e20;
    
            for (int i = 0; i < n; i++)
                dp[i][1][0] = dp[i][1][1] = 0.0;
    
            double ans = 1e20;
            for (int i = 0; i < n; i++)
                ans = min(ans, solvedp(i, n, 0));
    
            printf("%.3lf\n", ans);
        }
        return 0;
    }
    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    jmeter(八)断言
    jmeter(七)定时器
    jmeter(六)元件的作用域与执行顺序
    JS 正则详解
    表单验证
    ubuntu16.04安装Grafana
    Crontab详细用法-定时任务详解
    ubuntu16.04 安装influxdb,简单使用
    jQuery CSS操作 点赞样式
    jQuery文档处理
  • 原文地址:https://www.cnblogs.com/kedebug/p/2998964.html
Copyright © 2011-2022 走看看