第K条最小指令
题目链接
这道题帮我们重新回顾了一下动态规划求解排列组合问题的过程。
并给出了不错的思路求解类似问题。
class Solution {
public:
string kthSmallestPath(vector<int>& destination, int k) {
int h = destination[1];
int v = destination[0];
// 预处理组合数
vector<vector<int>> comb(h + v, vector<int>(h));
comb[0][0] = 1;
for (int i = 1; i < h + v; ++i) {
comb[i][0] = 1;
for (int j = 1; j <= i && j < h; ++j) {
comb[i][j] = comb[i - 1][j - 1] + comb[i - 1][j];
}
}
string ans;
for (int i = 0, imax = h + v; i < imax; ++i) {
if (h > 0) {
int o = comb[h + v - 1][h - 1];
if (k > o) {
ans += 'V';
--v;
k -= o;
}
else {
ans += 'H';
--h;
}
}
else {
ans += 'V';
--v;
}
}
return ans;
}
};
请注意这里的for循环。
题目的思路是通过尝试遍历确定每一位究竟放什么字符,这是题目的终止条件。
这里有一点需要注意的是,每次算法在完成之后,k的最终值都会是1,这同样可以被当成循环停止的条件。