三维动态规划
| int zeros; |
| int ones; |
| int len; |
| |
| void count(char *s) { |
| zeros = 0; |
| ones = 0; |
| int l = strlen(s); |
| for (int i = 0; i < l; ++i) { |
| if (s[i] == '0') zeros++; |
| if (s[i] == '1') ones++; |
| } |
| } |
| |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int recursive(char **strs, int curIndex, int z, int o) { |
| if (curIndex == len) return 0; |
| |
| int p1 = recursive(strs, curIndex + 1, z, o); |
| |
| int p2 = 0; |
| count(strs[curIndex]); |
| if (zeros <= z && ones <= o) |
| p2 = 1 + recursive(strs, curIndex + 1, z - zeros, o - ones); |
| return max(p1, p2); |
| } |
| |
| |
| int findMaxForm(char **strs, int strsSize, int m, int n) { |
| len = strsSize; |
| return recursive(strs, 0, m, n); |
| } |
| int zeros; |
| int ones; |
| int len; |
| |
| void count(char *s) { |
| zeros = 0; |
| ones = 0; |
| int l = strlen(s); |
| for (int i = 0; i < l; ++i) { |
| if (s[i] == '0') zeros++; |
| if (s[i] == '1') ones++; |
| } |
| } |
| |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| int ***dp; |
| |
| |
| int recursive(char **strs, int curIndex, int z, int o) { |
| if (curIndex == len) return 0; |
| if (dp[curIndex][z][o] != -1) return dp[curIndex][z][o]; |
| |
| int p1 = recursive(strs, curIndex + 1, z, o); |
| |
| int p2 = 0; |
| count(strs[curIndex]); |
| if (zeros <= z && ones <= o) |
| p2 = 1 + recursive(strs, curIndex + 1, z - zeros, o - ones); |
| int res = max(p1, p2); |
| dp[curIndex][z][o] = res; |
| return res; |
| } |
| |
| |
| int findMaxForm(char **strs, int strsSize, int m, int n) { |
| len = strsSize; |
| dp = (int ***) malloc(sizeof(int **) * len); |
| for (int i = 0; i < len; ++i) |
| dp[i] = (int **) malloc(sizeof(int *) * (m + 1)); |
| for (int i = 0; i < len; ++i) { |
| for (int j = 0; j <= m; ++j) { |
| dp[i][j] = (int *) malloc(sizeof(int) * (n + 1)); |
| memset(dp[i][j], -1, sizeof(int) * (n + 1)); |
| } |
| } |
| return recursive(strs, 0, m, n); |
| } |
| int zeros; |
| int ones; |
| |
| void count(char *s) { |
| zeros = 0; |
| ones = 0; |
| int l = strlen(s); |
| for (int i = 0; i < l; ++i) { |
| if (s[i] == '0') zeros++; |
| if (s[i] == '1') ones++; |
| } |
| } |
| |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int findMaxForm(char **strs, int strsSize, int m, int n) { |
| |
| int dp[strsSize + 1][m + 1][n + 1]; |
| |
| for (int i = 0; i <= m; ++i) |
| for (int j = 0; j <= n; ++j) |
| dp[strsSize][i][j] = 0; |
| |
| for (int curIndex = strsSize - 1; curIndex >= 0; curIndex--) { |
| count(strs[curIndex]); |
| |
| for (int z = 0, p1, p2; z <= m; ++z) { |
| for (int o = 0; o <= n; ++o) { |
| p1 = dp[curIndex + 1][z][o]; |
| p2 = 0; |
| if (zeros <= z && ones <= o) |
| p2 = 1 + dp[curIndex + 1][z - zeros][o - ones]; |
| dp[curIndex][z][o] = max(p1, p2); |
| } |
| } |
| } |
| return dp[0][m][n]; |
| } |
| |
| int zeros; |
| int ones; |
| |
| void count(char *s) { |
| zeros = 0; |
| ones = 0; |
| int l = strlen(s); |
| for (int i = 0; i < l; ++i) { |
| if (s[i] == '0') zeros++; |
| if (s[i] == '1') ones++; |
| } |
| } |
| |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int findMaxForm(char **strs, int strsSize, int m, int n) { |
| |
| int dp[m + 1][n + 1]; |
| |
| for (int i = 0; i <= m; ++i) |
| memset(dp[i], 0, sizeof(int) * (n + 1)); |
| |
| for (int i = strsSize - 1; i >= 0; i--) { |
| count(strs[i]); |
| |
| |
| for (int z = m; z >= zeros; z--) |
| for (int o = n; o >= ones; o--) |
| dp[z][o] = max(dp[z][o], dp[z - zeros][o - ones] + 1); |
| } |
| return dp[m][n]; |
| } |
| int *g; |
| int *p; |
| int gSize; |
| const int MOD = 1e9 + 7; |
| |
| |
| int recursive(int r, int s, int i) { |
| |
| if (r <= 0) return s <= 0 ? 1 : 0; |
| |
| if (i == gSize) return s <= 0 ? 1 : 0; |
| |
| int p1 = recursive(r, s, i + 1); |
| |
| int p2 = 0; |
| if (g[i] <= r) |
| p2 = recursive(r - g[i], s - p[i], i + 1); |
| return (p1 + p2) % MOD; |
| } |
| |
| |
| int profitableSchemes(int n, int minProfit, int *group, int groupSize, int *profit, int profitSize) { |
| p = profit; |
| g = group; |
| gSize = groupSize; |
| return recursive(n, minProfit, 0); |
| } |
| int *g; |
| int *p; |
| int gSize; |
| const int MOD = 1e9 + 7; |
| int ***dp; |
| |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int recursive(int r, int s, int i) { |
| |
| if (r <= 0) return s <= 0 ? 1 : 0; |
| |
| if (i == gSize) return s <= 0 ? 1 : 0; |
| if (dp[i][r][s] != -1) return dp[i][r][s]; |
| |
| int p1 = recursive(r, s, i + 1); |
| |
| int p2 = 0; |
| |
| |
| if (g[i] <= r) |
| p2 = recursive(r - g[i], max(s - p[i], 0), i + 1); |
| dp[i][r][s] = (p1 + p2) % MOD; |
| return dp[i][r][s]; |
| } |
| |
| |
| int profitableSchemes(int n, int minProfit, int *group, int groupSize, int *profit, int profitSize) { |
| p = profit; |
| g = group; |
| gSize = groupSize; |
| dp = (int ***) malloc(sizeof(int **) * groupSize); |
| for (int i = 0; i < groupSize; ++i) |
| dp[i] = (int **) malloc(sizeof(int *) * (n + 1)); |
| for (int i = 0; i < groupSize; ++i) { |
| for (int j = 0; j <= n; ++j) { |
| dp[i][j] = (int *) malloc(sizeof(int) * (minProfit + 1)); |
| memset(dp[i][j], -1, sizeof(int) * (minProfit + 1)); |
| } |
| } |
| |
| return recursive(n, minProfit, 0); |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int profitableSchemes(int n, int minProfit, int *group, int groupSize, int *profit, int profitSize) { |
| const int MOD = 1e9 + 7; |
| int dp[n + 1][minProfit + 1]; |
| for (int i = 0; i <= n; ++i) |
| for (int j = 0; j <= minProfit; ++j) |
| dp[i][j] = 0; |
| |
| for (int r = 0; r <= n; ++r) dp[r][0] = 1; |
| for (int i = groupSize - 1; i >= 0; i--) { |
| |
| for (int r = n; r >= 0; r--) { |
| for (int s = minProfit; s >= 0; s--) { |
| int p1 = dp[r][s]; |
| int p2 = group[i] <= r ? dp[r - group[i]][max(s - profit[i], 0)] : 0; |
| dp[r][s] = (p1 + p2) % MOD; |
| } |
| } |
| } |
| return dp[n][minProfit]; |
| } |
| double ***dp; |
| |
| |
| double recursive(int n, int i, int j, int k) { |
| |
| if (i < 0 || i >= n || j < 0 || j >= n) return 0; |
| if (dp[i][j][k] != -1) return dp[i][j][k]; |
| double res = 0; |
| if (k == 0) { |
| |
| res = 1; |
| } else { |
| |
| res += (recursive(n, i - 2, j + 1, k - 1) / 8); |
| res += (recursive(n, i - 1, j + 2, k - 1) / 8); |
| res += (recursive(n, i + 1, j + 2, k - 1) / 8); |
| res += (recursive(n, i + 2, j + 1, k - 1) / 8); |
| res += (recursive(n, i + 2, j - 1, k - 1) / 8); |
| res += (recursive(n, i + 1, j - 2, k - 1) / 8); |
| res += (recursive(n, i - 1, j - 2, k - 1) / 8); |
| res += (recursive(n, i - 2, j - 1, k - 1) / 8); |
| } |
| dp[i][j][k] = res; |
| return res; |
| } |
| |
| |
| double knightProbability(int n, int k, int row, int column) { |
| dp = (double ***) malloc(sizeof(double **) * n); |
| for (int i = 0; i < n; ++i) |
| dp[i] = (double **) malloc(sizeof(double *) * n); |
| for (int i = 0; i < n; ++i) { |
| for (int j = 0; j < n; ++j) { |
| dp[i][j] = (double *) malloc(sizeof(double) * (k + 1)); |
| for (int l = 0; l < k + 1; ++l) { |
| dp[i][j][l] = -1; |
| } |
| } |
| } |
| return recursive(n, row, column, k); |
| } |
| const int MOD = 1e9 + 7; |
| int rowSize; |
| int columnSize; |
| |
| |
| |
| long long recursive(int **grid, int i, int j, int k, int sum) { |
| |
| if (i >= rowSize || j >= columnSize) return 0; |
| |
| sum += grid[i][j]; |
| |
| if (i == rowSize - 1 && j == columnSize - 1 && (sum % k == 0)) { |
| return 1; |
| } |
| |
| return (recursive(grid, i + 1, j, k, sum) + recursive(grid, i, j + 1, k, sum)) % MOD; |
| } |
| |
| |
| int numberOfPaths(int **grid, int gridSize, int *gridColSize, int k) { |
| rowSize = gridSize; |
| columnSize = *gridColSize; |
| return recursive(grid, 0, 0, k, 0); |
| } |
| const int MOD = 1e9 + 7; |
| int rowSize; |
| int columnSize; |
| int ***dp; |
| |
| |
| |
| long long recursive(int **grid, int i, int j, int k, int r) { |
| |
| if (i >= rowSize || j >= columnSize) return 0; |
| |
| if (i == rowSize - 1 && j == columnSize - 1 && (grid[i][j] % k == r)) { |
| return 1; |
| } |
| |
| int need = (r - (grid[i][j] % k) + k) % k; |
| return (recursive(grid, i + 1, j, k, need) + recursive(grid, i, j + 1, k, need)) % MOD; |
| } |
| |
| |
| int numberOfPaths(int **grid, int gridSize, int *gridColSize, int k) { |
| rowSize = gridSize; |
| columnSize = *gridColSize; |
| return recursive(grid, 0, 0, k, 0); |
| } |
| const int MOD = 1e9 + 7; |
| int rowSize; |
| int columnSize; |
| int ***dp; |
| |
| |
| long long recursive(int **grid, int i, int j, int k, int r) { |
| |
| if (i >= rowSize || j >= columnSize) return 0; |
| |
| if (i == rowSize - 1 && j == columnSize - 1 && (grid[i][j] % k == r)) return 1; |
| if (dp[i][j][r] != -1) return dp[i][j][r]; |
| |
| int need = (r - (grid[i][j] % k) + k) % k; |
| int res = (recursive(grid, i + 1, j, k, need) + recursive(grid, i, j + 1, k, need)) % MOD; |
| dp[i][j][r] = res; |
| return res; |
| } |
| |
| |
| int numberOfPaths(int **grid, int gridSize, int *gridColSize, int k) { |
| rowSize = gridSize; |
| columnSize = *gridColSize; |
| |
| dp = (int ***) malloc(sizeof(int **) * rowSize); |
| for (int i = 0; i < rowSize; ++i) |
| dp[i] = (int **) malloc(sizeof(int *) * columnSize); |
| for (int i = 0; i < rowSize; ++i) { |
| for (int j = 0; j < columnSize; ++j) { |
| dp[i][j] = (int *) malloc(sizeof(int) * k); |
| memset(dp[i][j], -1, sizeof(int) * k); |
| } |
| } |
| return recursive(grid, 0, 0, k, 0); |
| } |
| const int MOD = 1e9 + 7; |
| int rowSize; |
| int columnSize; |
| |
| int numberOfPaths(int **grid, int gridSize, int *gridColSize, int k) { |
| rowSize = gridSize; |
| columnSize = *gridColSize; |
| |
| int dp[rowSize][columnSize][k]; |
| |
| memset(dp, 0, sizeof(int) * rowSize * columnSize * k); |
| |
| dp[rowSize - 1][columnSize - 1][grid[rowSize - 1][columnSize - 1] % k] = 1; |
| |
| |
| |
| for (int i = rowSize - 2; i >= 0; i--) |
| for (int r = 0; r < k; ++r) |
| dp[i][columnSize - 1][r] = dp[i + 1][columnSize - 1][(k + r - grid[i][columnSize - 1] % k) % k]; |
| |
| for (int j = columnSize - 2; j >= 0; j--) |
| for (int r = 0; r < k; ++r) |
| dp[rowSize - 1][j][r] = dp[rowSize - 1][j + 1][(k + r - grid[rowSize - 1][j] % k) % k]; |
| |
| for (int i = rowSize - 2; i >= 0; i--) { |
| for (int j = columnSize - 2; j >= 0; j--) { |
| for (int r = 0; r < k; ++r) { |
| int need = (k + r - grid[i][j] % k) % k; |
| dp[i][j][r] = (dp[i + 1][j][need] + dp[i][j + 1][need]) % MOD; |
| } |
| } |
| } |
| return dp[0][0][0]; |
| } |
| |
| bool recursive(char *s1, char *s2, int l1, int r1, int l2, int r2) { |
| |
| |
| |
| if (l1 == r1) return s1[l1] == s2[l2]; |
| |
| |
| |
| |
| for (int i = l1, j = l2; i < r1; i++, j++) |
| if (recursive(s1, s2, l1, i, l2, j) && recursive(s1, s2, i + 1, r1, j + 1, r2)) |
| return true; |
| |
| |
| |
| |
| for (int i = l1, j = r2; i < r1; i++, j--) |
| if (recursive(s1, s2, l1, i, j, r2) && recursive(s1, s2, i + 1, r1, l2, j - 1)) |
| return true; |
| return false; |
| } |
| |
| |
| bool isScramble(char *s1, char *s2) { |
| return recursive(s1, s2, 0, strlen(s1) - 1, 0, strlen(s2) - 1); |
| } |
| |
| bool recursive(char *s1, char *s2, int l1, int l2, int len) { |
| |
| |
| |
| if (len == 1) return s1[l1] == s2[l2]; |
| |
| |
| |
| |
| for (int k = 1; k < len; ++k) |
| if (recursive(s1, s2, l1, l2, k) && recursive(s1, s2, l1 + k, l2 + k, len - k)) |
| return true; |
| |
| |
| |
| |
| for (int i = l1 + 1, j = l2 + len - 1, k = 1; k < len; i++, j--, k++) |
| if (recursive(s1, s2, l1, j, k) && recursive(s1, s2, i, l2, len - k)) |
| return true; |
| return false; |
| } |
| |
| |
| bool isScramble(char *s1, char *s2) { |
| return recursive(s1, s2, 0, 0, strlen(s1)); |
| } |
| |
| int ***dp; |
| |
| |
| bool recursive(char *s1, char *s2, int l1, int l2, int len) { |
| |
| if (len == 1) return s1[l1] == s2[l2]; |
| |
| if (dp[l1][l2][len] != 0) return dp[l1][l2][len] == 1; |
| |
| bool res = false; |
| |
| |
| |
| for (int k = 1; k < len; ++k) |
| if (recursive(s1, s2, l1, l2, k) && recursive(s1, s2, l1 + k, l2 + k, len - k)) { |
| res = true; |
| break; |
| } |
| |
| |
| |
| |
| if (!res) { |
| for (int i = l1 + 1, j = l2 + len - 1, k = 1; k < len; i++, j--, k++) |
| if (recursive(s1, s2, l1, j, k) && recursive(s1, s2, i, l2, len - k)) { |
| res = true; |
| break; |
| } |
| } |
| dp[l1][l2][len] = res ? 1 : -1; |
| return res; |
| } |
| |
| |
| bool isScramble(char *s1, char *s2) { |
| int length = strlen(s1); |
| |
| dp = (int ***) malloc(sizeof(int **) * length); |
| for (int i = 0; i < length; ++i) |
| dp[i] = (int **) malloc(sizeof(int *) * length); |
| for (int i = 0; i < length; ++i) { |
| for (int j = 0; j < length; ++j) { |
| dp[i][j] = (int *) malloc(sizeof(int) * (length + 1)); |
| memset(dp[i][j], 0, sizeof(int) * (length + 1)); |
| } |
| } |
| return recursive(s1, s2, 0, 0, length); |
| } |
| |
| bool isScramble(char *s1, char *s2) { |
| int length = strlen(s1); |
| |
| bool dp[length][length][length + 1]; |
| memset(dp, 0, sizeof(bool) * length * length * (length + 1)); |
| |
| for (int l1 = 0; l1 < length; ++l1) |
| for (int l2 = 0; l2 < length; ++l2) |
| dp[l1][l2][1] = s1[l1] == s2[l2]; |
| for (int len = 2; len <= length; ++len) { |
| for (int l1 = 0; l1 <= length - len; ++l1) { |
| for (int l2 = 0; l2 <= length - len; ++l2) { |
| for (int k = 1; k < len; ++k) { |
| if (dp[l1][l2][k] && dp[l1 + k][l2 + k][len - k]) { |
| dp[l1][l2][len] = true; |
| break; |
| } |
| } |
| if (!dp[l1][l2][len]) { |
| for (int i = l1 + 1, j = l2 + len - 1, k = 1; k < len; i++, j--, k++) { |
| if (dp[l1][j][k] && dp[i][l2][len - k]) { |
| dp[l1][l2][len] = true; |
| break; |
| } |
| } |
| } |
| } |
| } |
| } |
| return dp[0][0][length]; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步