菜鸡双栈解法(单纯记录)
class Solution {
public:
int numWays(int n, vector<vector<int>>& relation, int k) {
stack<vector<int>> pre,cur;
sort(relation.begin(),relation.end());
int i=0,res=0;
while(i<relation.size()){
if(relation[i][0]==0) pre.push(relation[i++]);
else break;
}
for(int i=2;i<=k;i++){
while(!pre.empty()){
int right=pre.top()[1];
pre.pop();
int j=0;
while(j<relation.size()&&relation[j][0]<right) j++;
while(j<relation.size()&&relation[j][0]==right){
cur.push(relation[j]);
j++;
}
}
swap(pre,cur);
}
while(!pre.empty()){
int right=pre.top()[1];
pre.pop();
if(right==n-1) res++;
}
return res;
}
};
大神解法(重要)
表示第几轮到达编号 有几条途径。
第
轮能到达编号
的点的路径数为第
轮到达对应路径起点的路径数之和
我们每一轮
遍历所有的关系,那么比如对应关系
我们应该累加上一轮能够到达起点,即编号0位置的路径数,即
class Solution {
public:
int dp[6][10];
int numWays(int n, vector<vector<int>>& relation, int k) {
dp[0][0] = 1; / 默认一开始即第0轮到达起点
for(int i = 1; i <= k; i += 1)
for(auto v : relation)
dp[i][v[1]] += dp[i - 1][v[0]];
return dp[k][n - 1];
}
};
流程打印
class Solution {
public:
int dp[6][10];
int numWays(int n, vector<vector<int>>& relation, int k) {
dp[0][0] = 1;
for(int i = 1; i <= k; i += 1){
cout<<"i = "<<i<<endl;
for(auto v : relation){
int a=dp[i][v[1]];
cout<<"dp["<<i<<"]["<<v[1]<<"] + dp["<<i-1<<"]["<<v[0]<<"] = ";
dp[i][v[1]] += dp[i - 1][v[0]];
cout<<"dp["<<i<<"]["<<v[1]<<"]"<<endl;
cout<<a<<" + "<<dp[i - 1][v[0]]<<" = "<<dp[i][v[1]]<<endl;
}
cout<<endl;
}
return dp[k][n - 1];
}
};
输入
5
[[0,2],[2,1],[3,4],[2,3],[1,4],[2,0],[0,4]]
3
输出
3
预期结果
3
i = 1
dp[1][2] + dp[0][0] = dp[1][2]
0 + 1 = 1
dp[1][1] + dp[0][2] = dp[1][1]
0 + 0 = 0
dp[1][4] + dp[0][3] = dp[1][4]
0 + 0 = 0
dp[1][3] + dp[0][2] = dp[1][3]
0 + 0 = 0
dp[1][4] + dp[0][1] = dp[1][4]
0 + 0 = 0
dp[1][0] + dp[0][2] = dp[1][0]
0 + 0 = 0
dp[1][4] + dp[0][0] = dp[1][4]
0 + 1 = 1
i = 2
dp[2][2] + dp[1][0] = dp[2][2]
0 + 0 = 0
dp[2][1] + dp[1][2] = dp[2][1]
0 + 1 = 1
dp[2][4] + dp[1][3] = dp[2][4]
0 + 0 = 0
dp[2][3] + dp[1][2] = dp[2][3]
0 + 1 = 1
dp[2][4] + dp[1][1] = dp[2][4]
0 + 0 = 0
dp[2][0] + dp[1][2] = dp[2][0]
0 + 1 = 1
dp[2][4] + dp[1][0] = dp[2][4]
0 + 0 = 0
i = 3
dp[3][2] + dp[2][0] = dp[3][2]
0 + 1 = 1
dp[3][1] + dp[2][2] = dp[3][1]
0 + 0 = 0
dp[3][4] + dp[2][3] = dp[3][4]
0 + 1 = 1
dp[3][3] + dp[2][2] = dp[3][3]
0 + 0 = 0
dp[3][4] + dp[2][1] = dp[3][4]
1 + 1 = 2
dp[3][0] + dp[2][2] = dp[3][0]
0 + 0 = 0
dp[3][4] + dp[2][0] = dp[3][4]
2 + 1 = 3