zoukankan      html  css  js  c++  java
  • uva 1347

    看了佳爷才有思路的,这也是算法导论的dp课后练习--贴代码,用内置数组ac了,而思路相同的vector并没有过,在本地的两个测试样例都没有问题,不知道哪里出错,还用vector试了一下不等长的二维数组,结果wa,这里开心(捂胸口状

    ac

     1 #include <iostream>
     2 #include <vector>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <cstdio>
     6 
     7 using namespace std;
     8 
     9 const int maxn = 50 + 5;
    10 
    11 float dist[maxn][maxn], d[maxn][maxn];
    12 int x[maxn], y[maxn];
    13 
    14 int main(void)
    15 {
    16     int n;
    17     while (cin >> n)
    18     {
    19         for (int i = 0;i < n;i++)
    20             cin >> x[i] >> y[i];
    21         for (int i = 1;i < n;i++)
    22             for (int j = 0;j < i;j++)
    23                 dist[i][j] = sqrt((x[i] - x[j])*(x[i] - x[j]) 
    24                     + (y[i] - y[j]) * (y[i] - y[j]));
    25         for (int i = 0;i < n - 1;i++)
    26             d[n - 1][i] = dist[n - 1][i];
    27 
    28         for (int i = n - 2;i > 0;i--)
    29             for (int j = 0;j < i;j++)
    30                 d[i][j] = min(d[i + 1][j] + dist[i + 1][i],
    31                     d[i + 1][i] + dist[i + 1][j]);
    32         printf("%.2f
    ", d[1][0] + dist[1][0]);
    33     }
    34     return 0;
    35 }

    vector实现

     1 #include <iostream>
     2 #include <vector>
     3 #include <cmath>
     4 #include <algorithm>
     5 #include <cstdio>
     6 
     7 using namespace std;
     8 
     9 vector<pair<int, int> > point;
    10 int n;
    11 
    12 int sumofsquare(int i, int j)
    13 {
    14     int ix = point[i].first, iy = point[i].second;
    15     int jx = point[j].first, jy = point[j].second;
    16 
    17     return (ix - jx)*(ix - jx) + (iy - jy)*(iy - jy);
    18 }
    19 
    20 void calculate_dist(vector<vector<float> > &dist)
    21 {
    22     dist.push_back(vector<float>());
    23     for (int i = 1;i < n;i++)
    24         dist.push_back(vector<float>(i));
    25 
    26     for (int i = 1;i < n;++i)
    27         for (int j = 0;j < i;j++)
    28         {
    29             float dis_ij = sqrt(sumofsquare(i, j));
    30             dist[i][j] = dis_ij;
    31         }
    32 }
    33 
    34 float dp(vector<vector<float> > &d, vector<vector<float> > &dist)
    35 {
    36     d.push_back(vector<float>());
    37     for (int i = 1;i < n;i++)
    38         d.push_back(vector<float>(i));
    39 
    40     for (int i = 0;i < n - 1;i++)
    41         d[n - 1][i] = dist[n - 1][i];
    42     
    43     for(int i=n-2;i>0;i--)
    44         for (int j = 0;j < i;j++)
    45         {
    46             d[i][j] = min(d[i + 1][j] + dist[i + 1][i], d[i + 1][i] + dist[i + 1][j]);
    47         }
    48     return d[1][0] + dist[1][0];
    49 }
    50 
    51 int main(void)
    52 {
    53     while (cin >> n&&n > 0)
    54     {
    55         point.clear();//记得这一步,一开始wa都不知道哪里出问题真的傻逼
    56         for (int i = 0;i < n;i++)
    57         {
    58             int x, y;
    59             cin >> x >> y;
    60             point.push_back(make_pair(x, y));
    61         }
    62         vector<vector<float> > dist;
    63         calculate_dist(dist);
    64         vector<vector<float> >d;
    65         printf("%.2f
    ", dp(d, dist));
    66     }
    67     return 0;
    68 }
    //这些怎么删除啊啊啊啊,原来代码贴在这
     
  • 相关阅读:
    AT2165 Median Pyramid Hard
    AT2160 へんなコンパス / Manhattan Compass
    bzoj2863:愤怒的元首
    bzoj5336:[TJOI2018]party
    [luoguP3768]简单的数学题
    bzoj1831:[AHOI2008]逆序对
    bzoj5492:[Hnoi2019]校园旅行
    HNOI2019游记
    HDU 1102 Constructing Roads(kruskal)
    HDU 1059 Dividing
  • 原文地址:https://www.cnblogs.com/schsb/p/8688195.html
Copyright © 2011-2022 走看看