uva 1347

来源:互联网 发布:java file 编辑:程序博客网 时间:2024/06/15 03:44

参考紫书。

假设有两个人,选择不同的点,那么到终点时,他们的路径和,就是答案。因为dp[i][j] = dp[j][i]。所以我们可以只考虑 i > j。dp[i][j] 由 dp[i + 1][i](dp[i][j] 下一步 j -> i + 1) 和 dp[i + 1][j]转移而来。

#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int maxn = 100 + 5;double dp[maxn][maxn], dist[maxn][maxn], x[maxn], y[maxn];int main(){    int n;    while(scanf("%d", &n) == 1)    {        for(int i = 0; i < n; i++)            scanf("%lf%lf", &x[i], &y[i]);        for(int i = 0; i < n; i++)            for(int j = 0; j < n; j++)                dist[i][j] = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));        for(int i = n - 2; i >= 0; i--)        {            for(int j = 0; j < n; j++)            {                if(i == n - 2) dp[i][j] = dist[i][n - 1] + dist[j][n - 1];                else                {                    dp[i][j] = min(dp[i + 1][j] + dist[i + 1][i], dp[i + 1][i] + dist[i + 1][j]);                }            }        }        printf("%.2lf\n", dp[0][0]);    }    return 0;}


原创粉丝点击