uva 1347

参考紫书。

假设有两个人,选择不同的点,那么到终点时,他们的路径和,就是答案。因为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
#include
#include
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;
}


你可能感兴趣的:(uva)