二维动态规划
| int min(int a, int b) { |
| return a > b ? b : a; |
| } |
| |
| |
| int recursive(int **grid, int i, int j) { |
| if (i == 0 && j == 0) return grid[0][0]; |
| int up = 0x7fffffff; |
| int left = 0x7fffffff; |
| if (i - 1 >= 0) up = recursive(grid, i - 1, j); |
| if (j - 1 >= 0) left = recursive(grid, i, j - 1); |
| |
| return grid[i][j] + min(up, left); |
| } |
| |
| |
| int minPathSum(int **grid, int gridSize, int *gridColSize) { |
| return recursive(grid, gridSize - 1, (*gridColSize) - 1); |
| } |
| int min(int a, int b) { |
| return a > b ? b : a; |
| } |
| |
| int **dp; |
| |
| |
| int recursive(int **grid, int i, int j) { |
| |
| if (dp[i][j] != -1) return dp[i][j]; |
| if (i == 0 && j == 0) { |
| dp[i][j] = grid[0][0]; |
| } else { |
| int up = 0x7fffffff; |
| int left = 0x7fffffff; |
| if (i - 1 >= 0) up = recursive(grid, i - 1, j); |
| if (j - 1 >= 0) left = recursive(grid, i, j - 1); |
| |
| dp[i][j] = grid[i][j] + min(up, left); |
| } |
| return dp[i][j]; |
| } |
| |
| |
| int minPathSum(int **grid, int gridSize, int *gridColSize) { |
| dp = (int **) malloc(sizeof(int *) * gridSize); |
| for (int i = 0; i < gridSize; ++i) { |
| dp[i] = (int *) malloc(sizeof(int) * (*gridColSize)); |
| memset(dp[i], -1, sizeof(int) * (*gridColSize)); |
| } |
| return recursive(grid, gridSize - 1, (*gridColSize) - 1); |
| } |
| int min(int a, int b) { |
| return a > b ? b : a; |
| } |
| |
| |
| int minPathSum(int **grid, int gridSize, int *gridColSize) { |
| int rowSize = gridSize; |
| int columnSize = *gridColSize; |
| |
| int dp[columnSize]; |
| dp[0] = grid[0][0]; |
| |
| for (int i = 1; i < columnSize; ++i) |
| dp[i] = dp[i - 1] + grid[0][i]; |
| |
| for (int i = 1; i < rowSize; ++i) { |
| |
| dp[0] += grid[i][0]; |
| |
| for (int j = 1; j < columnSize; ++j) |
| dp[j] = min(dp[j - 1], dp[j]) + grid[i][j]; |
| } |
| |
| return dp[columnSize - 1]; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int recursive(char *s1, char *s2, int i1, int i2) { |
| if (i1 < 0 || i2 < 0) return 0; |
| |
| int p1 = recursive(s1, s2, i1 - 1, i2 - 1); |
| int p2 = recursive(s1, s2, i1 - 1, i2); |
| int p3 = recursive(s1, s2, i1, i2 - 1); |
| int p4 = s1[i1] == s2[i2] ? (p1 + 1) : 0; |
| return max(max(p1, p2), max(p3, p4)); |
| } |
| |
| |
| int longestCommonSubsequence(char *text1, char *text2) { |
| return recursive(text1, text2, strlen(text1) - 1, strlen(text2) - 1); |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int recursive(char *s1, char *s2, int len1, int len2) { |
| if (len1 == 0 || len2 == 0) return 0; |
| if (s1[len1 - 1] == s2[len2 - 1]) |
| return recursive(s1, s2, len1 - 1, len2 - 1) + 1; |
| |
| return max(recursive(s1, s2, len1 - 1, len2), recursive(s1, s2, len1, len2 - 1)); |
| } |
| |
| |
| int longestCommonSubsequence(char *text1, char *text2) { |
| return recursive(text1, text2, strlen(text1), strlen(text2)); |
| } |
| |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| int **dp; |
| int length1; |
| int length2; |
| |
| |
| int recursive(char *s1, char *s2, int len1, int len2) { |
| if (len1 == 0 || len2 == 0) return 0; |
| if (dp[len1][len2] != -1) return dp[len1][len2]; |
| if (s1[len1 - 1] == s2[len2 - 1]) { |
| dp[len1][len2] = recursive(s1, s2, len1 - 1, len2 - 1) + 1; |
| } else { |
| |
| dp[len1][len2] = max(recursive(s1, s2, len1 - 1, len2), recursive(s1, s2, len1, len2 - 1)); |
| } |
| return dp[len1][len2]; |
| } |
| |
| |
| int longestCommonSubsequence(char *text1, char *text2) { |
| length1 = strlen(text1); |
| length2 = strlen(text2); |
| dp = (int **) malloc(sizeof(int *) * (length1 + 1)); |
| for (int i = 0; i <= length1; ++i) { |
| dp[i] = (int *) malloc(sizeof(int) * (length2 + 1)); |
| memset(dp[i], -1, sizeof(int) * (length2 + 1)); |
| } |
| |
| return recursive(text1, text2, length1, length2); |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int longestCommonSubsequence(char *text1, char *text2) { |
| int length1 = strlen(text1); |
| int length2 = strlen(text2); |
| int dp[length1 + 1][length2 + 1]; |
| |
| for (int i = 0; i <= length1; ++i) dp[i][0] = 0; |
| for (int i = 0; i <= length2; ++i) dp[0][i] = 0; |
| |
| for (int len1 = 1; len1 <= length1; ++len1) { |
| for (int len2 = 1; len2 <= length2; ++len2) { |
| if (text1[len1 - 1] == text2[len2 - 1]) |
| dp[len1][len2] = dp[len1 - 1][len2 - 1] + 1; |
| else |
| dp[len1][len2] = max(dp[len1 - 1][len2], dp[len1][len2 - 1]); |
| } |
| } |
| |
| return dp[length1][length2]; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int longestCommonSubsequence(char *text1, char *text2) { |
| char *s1, *s2; |
| |
| if (strlen(text1) < strlen(text2)) { |
| s1 = text2; |
| s2 = text1; |
| } else { |
| s1 = text1; |
| s2 = text2; |
| } |
| int length1 = strlen(s1); |
| int length2 = strlen(s2); |
| |
| int dp[length2 + 1]; |
| |
| memset(dp, 0, sizeof(int) * (length2 + 1)); |
| for (int len1 = 1; len1 <= length1; ++len1) { |
| |
| int leftUp = dp[0]; |
| |
| int temp; |
| for (int len2 = 1; len2 <= length2; ++len2) { |
| temp = dp[len2]; |
| if (s1[len1 - 1] == s2[len2 - 1]) |
| |
| dp[len2] = leftUp + 1; |
| else |
| |
| dp[len2] = max(dp[len2 - 1], dp[len2]); |
| leftUp = temp; |
| } |
| } |
| return dp[length2]; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int recursive(char *s, int left, int right) { |
| |
| |
| if (left == right) return 1; |
| |
| if (left + 1 == right) return s[left] == s[right] ? 2 : 1; |
| if (s[left] == s[right]) { |
| return recursive(s, left + 1, right - 1) + 2; |
| } else { |
| return max(recursive(s, left, right - 1), recursive(s, left + 1, right)); |
| } |
| } |
| |
| |
| int longestPalindromeSubseq(char *s) { |
| return recursive(s, 0, strlen(s) - 1); |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| int **dp; |
| int len; |
| |
| |
| int recursive(char *s, int left, int right) { |
| |
| if (left == right) return 1; |
| |
| if (left + 1 == right) { |
| dp[left][right] = s[left] == s[right] ? 2 : 1; |
| } |
| |
| if (dp[left][right] != -1) return dp[left][right]; |
| if (s[left] == s[right]) { |
| dp[left][right] = recursive(s, left + 1, right - 1) + 2; |
| } else { |
| dp[left][right] = max(recursive(s, left, right - 1), recursive(s, left + 1, right)); |
| } |
| return dp[left][right]; |
| } |
| |
| |
| int longestPalindromeSubseq(char *s) { |
| len = strlen(s); |
| |
| dp = (int **) malloc(sizeof(int *) * len); |
| for (int i = 0; i < len; ++i) { |
| dp[i] = (int *) malloc(sizeof(int) * len); |
| memset(dp[i], -1, sizeof(int) * len); |
| } |
| |
| for (int i = 0; i < len; ++i) dp[i][i] = 1; |
| |
| return recursive(s, 0, len - 1); |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int longestPalindromeSubseq(char *s) { |
| int len = strlen(s); |
| |
| int dp[len][len]; |
| for (int left = len - 1; left >= 0; left--) { |
| |
| dp[left][left] = 1; |
| |
| if (left + 1 < len) |
| dp[left][left + 1] = s[left] == s[left + 1] ? 2 : 1; |
| |
| for (int right = left + 2; right < len; ++right) { |
| if (s[left] == s[right]) |
| dp[left][right] = dp[left + 1][right - 1] + 2; |
| else |
| dp[left][right] = max(dp[left + 1][right], dp[left][right - 1]); |
| } |
| } |
| |
| return dp[0][len - 1]; |
| } |
| int max(int a, int b) { |
| return a > b ? a : b; |
| } |
| |
| |
| int longestPalindromeSubseq(char *s) { |
| int len = strlen(s); |
| int dp[len]; |
| |
| int leftDown; |
| for (int left = len - 1; left >= 0; left--) { |
| |
| dp[left] = 1; |
| |
| if (left + 1 < len) { |
| |
| leftDown = dp[left + 1]; |
| |
| dp[left + 1] = s[left] == s[left + 1] ? 2 : 1; |
| } |
| |
| for (int right = left + 2; right < len; ++right) { |
| int backup = dp[right]; |
| if (s[left] == s[right]) |
| dp[right] = leftDown + 2; |
| else |
| |
| dp[right] = max(dp[right], dp[right - 1]); |
| leftDown = backup; |
| } |
| } |
| |
| return dp[len - 1]; |
| } |
| package class067; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| import java.io.BufferedReader; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.io.OutputStreamWriter; |
| import java.io.PrintWriter; |
| import java.io.StreamTokenizer; |
| |
| public class Code05_NodenHeightNotLargerThanm { |
| |
| public static void main(String[] args) throws IOException { |
| BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); |
| StreamTokenizer in = new StreamTokenizer(br); |
| PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); |
| while (in.nextToken() != StreamTokenizer.TT_EOF) { |
| int n = (int) in.nval; |
| in.nextToken(); |
| int m = (int) in.nval; |
| out.println(compute3(n, m)); |
| } |
| out.flush(); |
| out.close(); |
| br.close(); |
| } |
| |
| public static int MAXN = 51; |
| |
| public static int MOD = 1000000007; |
| |
| |
| public static long[][] dp1 = new long[MAXN][MAXN]; |
| |
| static { |
| for (int i = 0; i < MAXN; i++) { |
| for (int j = 0; j < MAXN; j++) { |
| dp1[i][j] = -1; |
| } |
| } |
| } |
| |
| |
| |
| |
| |
| public static int compute1(int n, int m) { |
| if (n == 0) { |
| return 1; |
| } |
| |
| if (m == 0) { |
| return 0; |
| } |
| if (dp1[n][m] != -1) { |
| return (int) dp1[n][m]; |
| } |
| long ans = 0; |
| |
| for (int k = 0; k < n; k++) { |
| |
| |
| ans = (ans + ((long) compute1(k, m - 1) * compute1(n - k - 1, m - 1)) % MOD) % MOD; |
| } |
| dp1[n][m] = ans; |
| return (int) ans; |
| } |
| |
| |
| public static long[][] dp2 = new long[MAXN][MAXN]; |
| |
| public static int compute2(int n, int m) { |
| for (int j = 0; j <= m; j++) { |
| dp2[0][j] = 1; |
| } |
| for (int i = 1; i <= n; i++) { |
| for (int j = 1; j <= m; j++) { |
| dp2[i][j] = 0; |
| for (int k = 0; k < i; k++) { |
| |
| |
| dp2[i][j] = (dp2[i][j] + dp2[k][j - 1] * dp2[i - k - 1][j - 1] % MOD) % MOD; |
| } |
| } |
| } |
| return (int) dp2[n][m]; |
| } |
| |
| |
| public static long[] dp3 = new long[MAXN]; |
| |
| public static int compute3(int n, int m) { |
| dp3[0] = 1; |
| for (int i = 1; i <= n; i++) { |
| dp3[i] = 0; |
| } |
| for (int j = 1; j <= m; j++) { |
| |
| for (int i = n; i >= 1; i--) { |
| |
| dp3[i] = 0; |
| for (int k = 0; k < i; k++) { |
| |
| dp3[i] = (dp3[i] + dp3[k] * dp3[i - k - 1] % MOD) % MOD; |
| } |
| } |
| } |
| return (int) dp3[n]; |
| } |
| |
| } |
| int rowSize; |
| int columnSize; |
| int directions[4][2] = {{-1, 0}, |
| {1, 0}, |
| {0, -1}, |
| {0, 1}}; |
| |
| bool isPositionLegal(int i, int j) { |
| return i >= 0 && i < rowSize && j >= 0 && j < columnSize; |
| } |
| |
| |
| int recursive(int **matrix, int i, int j, int pre) { |
| if (pre >= matrix[i][j]) return 0; |
| |
| int max = 0; |
| for (int k = 0; k < 4; ++k) { |
| int nextI = i + directions[k][0]; |
| int nextJ = j + directions[k][1]; |
| |
| if (isPositionLegal(nextI, nextJ)) { |
| int temp = recursive(matrix, nextI, nextJ, matrix[i][j]); |
| if (temp > max) max = temp; |
| } |
| } |
| return max + 1; |
| } |
| |
| |
| int longestIncreasingPath(int **matrix, int matrixSize, int *matrixColSize) { |
| rowSize = matrixSize; |
| columnSize = *matrixColSize; |
| int res = 0; |
| for (int i = 0; i < rowSize; ++i) { |
| for (int j = 0; j < columnSize; ++j) { |
| int temp = recursive(matrix, i, j, -1); |
| if (temp > res) res = temp; |
| } |
| } |
| return res; |
| } |
| int rowSize; |
| int columnSize; |
| int directions[4][2] = {{-1, 0}, |
| {1, 0}, |
| {0, -1}, |
| {0, 1}}; |
| int **dp; |
| |
| bool isPositionLegal(int i, int j) { |
| return i >= 0 && i < rowSize && j >= 0 && j < columnSize; |
| } |
| |
| |
| int recursive(int **matrix, int i, int j, int pre) { |
| if (pre >= matrix[i][j]) return 0; |
| if (dp[i][j] != -1) return dp[i][j]; |
| |
| int max = 0; |
| for (int k = 0; k < 4; ++k) { |
| int nextI = i + directions[k][0]; |
| int nextJ = j + directions[k][1]; |
| |
| if (isPositionLegal(nextI, nextJ)) { |
| int temp = recursive(matrix, nextI, nextJ, matrix[i][j]); |
| if (temp > max) max = temp; |
| } |
| } |
| dp[i][j] = max + 1; |
| return dp[i][j]; |
| } |
| |
| |
| int longestIncreasingPath(int **matrix, int matrixSize, int *matrixColSize) { |
| rowSize = matrixSize; |
| columnSize = *matrixColSize; |
| dp = (int **) malloc(sizeof(int *) * rowSize); |
| for (int i = 0; i < rowSize; ++i) { |
| dp[i] = (int *) malloc(sizeof(int) * columnSize); |
| memset(dp[i], -1, sizeof(int) * columnSize); |
| } |
| int res = 0; |
| for (int i = 0; i < rowSize; ++i) { |
| for (int j = 0; j < columnSize; ++j) { |
| int temp = recursive(matrix, i, j, -1); |
| if (temp > res) res = temp; |
| } |
| } |
| return res; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2023-01-28 链表简单题