@LIUHUAN
2020-01-19T16:39:09.000000Z
字数 2739
阅读 849
algorithm
unordered_map<int, vector<int>> umap;const int M = int(1e9 + 7);int knightDialer(int N){umap[0] = { 4, 6 };umap[1] = { 6, 8 };umap[2] = { 7, 9 };umap[3] = { 4, 8 };umap[4] = { 0, 3, 9 };umap[5] = {};umap[6] = { 0, 1, 7 };umap[7] = { 2, 6 };umap[8] = { 1, 3 };umap[9] = { 2, 4 };int c = 0;for (int i = 0; i < 10; i++) {c += knight(i, 1, N);c %= M;}return c;}int knight(int k, int step, int n){if (step == n)return 1;auto list = umap[k];int size = list.size();int s = 0;for (int i = 0; i < size; i++) {int x = knight(list[i], step + 1, n);s += x % M;s %= M;}return s % M;}
map,也可以用数组,来缓存已经计算完的数据。对于已经获取的数据直接返回结果。map来保存,例如map[i-j]=x,表示选择结果。
unordered_map<int, vector<int>> umap;unordered_map<string, int> cache;const int M = int(1e9 + 7);int knightDialer(int N){umap.clear();cache.clear();umap[0] = { 4, 6 };umap[1] = { 6, 8 };umap[2] = { 7, 9 };umap[3] = { 4, 8 };umap[4] = { 0, 3, 9 };umap[5] = {};umap[6] = { 0, 1, 7 };umap[7] = { 2, 6 };umap[8] = { 1, 3 };umap[9] = { 2, 4 };int c = 0;for (int i = 0; i < 10; i++) {c += knight(i, 1, N);c %= M;}return c;}int knight(int k, int step, int n){if (step == n)return 1;string key = to_string(k) + "-" + to_string(step);if (cache.find(key) != cache.end()) {return cache[key];}auto list = umap[k];int size = list.size();int s = 0;for (int i = 0; i < size; i++) {int x = knight(list[i], step + 1, n);s += x % M;s %= M;}cache[key] = s % M;return cache[key];}
unordered_map<int, vector<int>> umap;const int M = int(1e9 + 7);int knightDialer(int N){umap[0] = { 4, 6 };umap[1] = { 6, 8 };umap[2] = { 7, 9 };umap[3] = { 4, 8 };umap[4] = { 0, 3, 9 };umap[5] = {};umap[6] = { 0, 1, 7 };umap[7] = { 2, 6 };umap[8] = { 1, 3 };umap[9] = { 2, 4 };int c = 0;int size = 10;vector<vector<int>> dp(size, vector<int>(N, 0));// base case #1for (int i = 0; i < size; i++) {dp[i][0] = 1;}for (int s = 1; s < N; s++) {for (int i = 0; i < size; i++) {auto next = umap[i];for (auto e : next) { //dp[i][s] += dp[e][s - 1];dp[i][s] %= M;}}}for (int i = 0; i < size; i++) {c += dp[i][N - 1];c %= M;}return c % M;}