@LIUHUAN
2020-01-20T00:39:09.000000Z
字数 2739
阅读 667
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 #1
for (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;
}