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\n", 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\n", dp(d, dist));
66     }
67     return 0;
68 }

 

//这些怎么删除啊啊啊啊,原来代码贴在这

 

 

 

posted on 2018-04-01 20:54  只是个回忆录  阅读(127)  评论(0)    收藏  举报

导航