classSolution { public: intgetLength(vector<string>& grid){ int m = grid.size(); int n = grid[0].size(); int res = 0; int dir[4][2] = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}}; int cr[4] = {3, 2, 1, 0}; int cl[4] = {1, 0, 3, 2}; queue<tuple<int,int,int>> qu; int x = 0, y = 0, d = 3; while(x >= 0 && y >= 0 && x < m && y < n) { res++; if (grid[x][y] == '.') { x = x + dir[d][0]; y = y + dir[d][1]; } elseif (grid[x][y] == 'L') { d = cl[d]; x = x + dir[d][0]; y = y + dir[d][1]; } elseif (grid[x][y] == 'R') { d = cr[d]; x = x + dir[d][0]; y = y + dir[d][1]; } } return res; } };
221021天池-03. 整理书架
题目
书架上有若干本书,从左至右的书籍编号记于整型数组 order 中。为保证书籍多样性,管理员想取走一些重复编号的书籍,要求满足以下条件:
时间复杂度:时间复杂度为 $O(limit \times n \times \log n)$,$n$ 为数组的长度。
空间复杂度:时间复杂度为 $O(n \times m)$。
代码
classSolution { public: intbrilliantSurprise(vector<vector<int>>& present, int limit){ int ans = 0; int n = present.size(); vector<vector<int>> s(n); for (int i = 0; i < present.size(); i += 1) { s[i].resize(present[i].size() + 1); for (int j = 0; j < present[i].size(); j += 1) s[i][j + 1] = s[i][j] + present[i][j]; } vector<int> dp(limit + 1); function<void(int, int)> DFS = [&](int L, int R) { int M = (L + R) / 2; if (L == R) { for (int i = 0, pre = 0; i <= limit; i += 1) { pre = max(pre, dp[i]); ans = max(ans, pre + s[M][min((int)s[M].size() - 1, limit - i)]); } return; } { auto f = dp; for (int i = M + 1; i <= R; i += 1) { auto g = dp; int x = (int)s[i].size() - 1, y = s[i].back(); for (int j = x; j <= limit; j += 1) g[j] = max(g[j], dp[j - x] + y); dp.swap(g); } DFS(L, M); dp = f; } { auto f = dp; for (int i = L; i <= M; i += 1) { auto g = dp; int x = (int)s[i].size() - 1, y = s[i].back(); for (int j = x; j <= limit; j += 1) g[j] = max(g[j], dp[j - x] + y); dp.swap(g); } DFS(M + 1, R); dp = f; } }; DFS(0, n - 1); return ans; } };