最大正方形&&旋转数组&&正则表达式匹配

171 阅读9分钟

NC108 最大正方形

题目链接

1、解题思路

简单dp,装填转移方程

if (matrix[i - 1][j - 1] == 1) {
    int val = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1]));
    dp[i][j] = val + 1;
}
2、代码
import java.util.*;


public class Solution {
    /**
     * 最大正方形
     * @param matrix char字符型二维数组 
     * @return int整型
     */
    public int solve (char[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return 0;
        }
        int row = matrix.length;
        int col = matrix[0].length;
        int[][] dp = new int[row + 1][col + 1];
        for (int i = 0; i <= row; i++) {
            dp[i][0] = 0;
        }
        for (int i = 0; i <= col; i++) {
            dp[0][i] = 0;
        }
        int len = 0;
        for (int i = 1; i <= row; i++) {
            for (int j = 1; j <= col; j++) {
                if (matrix[i-1][j-1] == '1') {
                    int val = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1]));
                    dp[i][j] = val + 1;
                }
                if (dp[i][j] > len) {
                    len = dp[i][j];
                }
            }
        }
        return len * len;
    }
}

NC110 旋转数组

题目链接

1、解题思路

整体旋转之后,然后对局部进行旋转,然后即可达到旋转的目的。这样空间复杂度为O(1),时间复杂度为O(n)。

2、代码
import java.util.*;


public class Solution {
    /**
     * 旋转数组
     * @param n int整型 数组长度
     * @param m int整型 右移距离
     * @param a int整型一维数组 给定数组
     * @return int整型一维数组
     */
    private void reverse(int[] arr, int l, int r) {
        while (l < r) {
            int temp = arr[l];
            arr[l] = arr[r];
            arr[r] = temp;
            l++;
            r--;
        }
    }

    public int[] solve(int n, int m, int[] a) {
        m = m % n;
        reverse(a, 0, n - 1);
        reverse(a, 0, m - 1);
        reverse(a, m, n - 1);
        return a;
    }
}

NC122 正则表达式匹配

题目链接

1、解题思路

dp的思想,需要处理细节。

2、代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param pattern string字符串 
     * @return bool布尔型
     */
    public boolean match (String str, String pattern) {
        int n = str.length();
        int m = pattern.length();
        str = " " + str;
        pattern = " " + pattern;
        char[] strArr = str.toCharArray();
        char[] patternArr = pattern.toCharArray();
        boolean[][] f = new boolean[n + 1][m + 1];
        f[0][0] = true;
        for (int i = 0; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (j + 1 <= m && patternArr[j + 1] == '*') {
                    continue;
                } else if (i - 1 >= 0 && patternArr[j] != '*') {
                    f[i][j] = f[i - 1][j - 1] && (strArr[i] == patternArr[j] || patternArr[j] == '.');
                } else if (patternArr[j] == '*') {
                    f[i][j] = (j - 2 >= 0 && f[i][j - 2]) || (i - 1 >= 0 && f[i - 1][j] && (patternArr[j - 1] == '.' || patternArr[j - 1] == strArr[i]));
                }
            }
        }
        return f[n][m];
    }
}