[leetcode]Beautiful Arrangement
链接:https://leetcode.com/problems/beautiful-arrangement/description/
Question
Suppose you have N integers from 1 to N. We define a beautiful arrangement as an array that is constructed by these N numbers successfully if one of the following is true for the ith position (1 <= i <= N) in this array:
- The number at the ith position is divisible by i.
- i is divisible by the number at the ith position.
Now given N, how many beautiful arrangements can you construct?
Example 1
Input: 2
Output: 2
Explanation:
The first beautiful arrangement is [1, 2]:
Number at the 1st position (i=1) is 1, and 1 is divisible by i (i=1).
Number at the 2nd position (i=2) is 2, and 2 is divisible by i (i=2).
The second beautiful arrangement is [2, 1]:
Number at the 1st position (i=1) is 2, and 2 is divisible by i (i=1).
Number at the 2nd position (i=2) is 1, and i (i=2) is divisible by 1.
Note:
- N is a positive integer and will not exceed 15.
Solution
class Solution {
public:
#define print(A) cout << #A << A << endl;
int res;
int N;
void dfs(vector<bool> visited, int numLeft) {
if (numLeft == 0) {
res++;
return;
}
for (int i = 1; i <= N; i++) {
if (!visited[i]) {
int pos = N-numLeft+1;
if (i % pos == 0 || pos % i == 0) {
visited[i] = true;
dfs(visited, numLeft-1);
visited[i] = false;
}
}
}
}
int countArrangement(int N) {
res = 0;
this->N = N;
vector<bool> visited;
visited.resize(N+1, false);
dfs(visited, N);
return res;
}
};
思路:递归即可,不需要状态压缩。这种求最大或最小值的问题一般都是通过递归或者动归来解,如果动归想不到就用递归吧。