看了佳爷才有思路的,这也是算法导论的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 }
//这些怎么删除啊啊啊啊,原来代码贴在这