我试图找到矩阵(m,n)从左上角到右下角的路径数。我还想存储所有这些可能的路径。 我已经解决了使用DP的路径数量。 T:O(m n),S:O(m n) 我也解决了查找和存储所有路径的问题;然而,在这里,我的空间复杂性是一团糟。大致:O(max(m,n)^ 4)~O(m ^ 4)/ O(n ^ 4)中较大者。
我已经分配了一个2D数组来存储路径。但是这个数组的每个元素都需要是一个路径列表,这很令人不安。我在这里展示了我的代码,经过测试和工作。 有更好的解决方案吗?
void T(int **&A, vector<vector<pair<int, int> > > **&P, int m, int n) {
vector<vector<pair<int, int> > > v1, v2;
vector<pair<int,int> > v11, v22;
pair<int,int> p1(m-1,0), p2(0,n-1);
v11.push_back(p1);
v22.push_back(p2);
v1.push_back(v11);
v2.push_back(v22);
P[m-1][0] = v1;
P[0][n-1] = v2;
for (int i = m-1; i >= 0; i--) {
A[i][0] = 1;
pair<int,int> pi(i,0);
if (i != m-1) {
P[i+1][0][0].insert(P[i+1][0][0].begin(),pi);
vector<pair<int,int> > tt = P[i+1][0][0];
vector<vector<pair<int,int> > > kk;
kk.push_back(tt);
P[i][0] = kk;
}
}
for (int i = n-1; i >= 0; i--) {
A[0][i] = 1;
pair<int,int> pi(0,i);
if (i != n-1) {
P[0][i+1][0].insert(P[0][i+1][0].begin(),pi);
vector<pair<int,int> > tt = P[0][i+1][0];
vector<vector<pair<int,int> > > kk;
kk.push_back(tt);
P[0][i] = kk;
}
}
for (int i = 1; i < m; i++)
for (int j = 1; j < n; j++) {
A[i][j] = A[i-1][j] + A[i][j-1];
pair<int,int> pij(i,j);
vector<vector<pair<int,int> > > vv = P[i-1][j];
vector<vector<pair<int,int> > > ww = P[i][j-1];
for (int k = 0; k < vv.size(); k++) {
vv[k].push_back(pij);
}
for (int k = 0; k < ww.size(); k++) {
ww[k].push_back(pij);
vv.push_back(ww[k]);
}
P[i][j] = vv;
}
}
void PrintPaths(vector<vector<pair<int, int> > > **&P, int m, int n) {
vector<vector<pair<int,int> > > vv = P[m-1][n-1];
for (int i = 0; i < vv.size(); i++) {
for (int j = 0; j < vv[i].size(); j++) {
cout<<"("<<vv[i][j].first<<","<<vv[i][j].second<<")";
if (j != vv[i].size()-1)
cout<<"->";
}
cout<<endl;
}
}
int main() {
int m = 2;
int n = 2;
int **A = new int*[m];
vector<vector<pair<int,int> > > **P = new vector<vector<pair<int,int> > >*[m];
for (int i = 0; i < m; i++) {
A[i] = new int[n];
P[i] = new vector<vector<pair<int,int> > >[n];
}
T(A,P,m,n);
PrintPaths(P,m,n);
for (int i = 0; i < m; i++) {
delete[] A[i];
delete[] P[i];
}
delete[] A;
delete[] P;
return 0;
}