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

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

  • 相关阅读:
    Codeforces Round #592 (Div. 2)C. The Football Season(暴力,循环节)
    Educational Codeforces Round 72 (Rated for Div. 2)D. Coloring Edges(想法)
    扩展KMP
    poj 1699 Best Sequence(dfs)
    KMP(思路分析)
    poj 1950 Dessert(dfs)
    poj 3278 Catch That Cow(BFS)
    素数环(回溯)
    sort与qsort
    poj 1952 buy low buy lower(DP)
  • 原文地址:https://www.cnblogs.com/kedebug/p/2998964.html
Copyright © 2011-2022 走看看