解题思路:
一道非常常规的回溯题,定义访问数组,用来统计每栋楼的入度出度情况,从第一个请求开始,选择该请求或者不选择该请求,直到所有请求都遍历完毕,这个时候如果所有楼入度出度为0,则该请求序列可达成,更新最长请求序列。注意,每次选择当前请求后,要记得回溯,把访问数组恢复成上一个请求时的状态,代码如下:
class Solution {
private:
int n;
int size;
int request = 0;
vector visited;
public:
int maximumRequests(int n, vector>& requests) {
this->n = n;
size = requests.size();
visited = vector(n, 0);
dfs(0, 0, requests);
return request;
}
void dfs(int i, int len, vector>& requests) {
// 超过请求长度
if(i == size) {
for(int j = 0; j < n; j ++) {
if(visited[j] != 0) {
return;
}
}
request = max(request, len);
return;
}
// 跳过该请求
dfs(i + 1, len, requests);
// 选择该请求
visited[requests[i][0]] --;
visited[requests[i][1]] ++;
dfs(i + 1, len + 1, requests);
// 回溯
visited[requests[i][0]] ++;
visited[requests[i][1]] --;
}
};


![LeetCode 1601 最多可达成的换楼请求数目[回溯 dfs] HERODING的LeetCode之路 LeetCode 1601 最多可达成的换楼请求数目[回溯 dfs] HERODING的LeetCode之路](http://www.mshxw.com/aiimages/31/748956.png)
