剑指offer计划29(动态规划困难)---java
1.1、题目1
剑指 Offer 19. 正则表达式匹配
1.2、解法
动态规划后面再研究
1.3、代码
class Solution {
public boolean isMatch(String s, String p) {
int m = s.length() + 1, n = p.length() + 1;
boolean[][] dp = new boolean[m][n];
dp[0][0] = true;
for(int j = 2; j < n; j += 2)
dp[0][j] = dp[0][j - 2] && p.charAt(j - 1) == '*';
for(int i = 1; i < m; i++) {
for(int j = 1; j < n; j++) {
dp[i][j] = p.charAt(j - 1) == '*' ?
dp[i][j - 2] || dp[i - 1][j] && (s.charAt(i - 1) == p.charAt(j - 2) || p.charAt(j - 2) == '.') :
dp[i - 1][j - 1] && (p.charAt(j - 1) == '.' || s.charAt(i - 1) == p.charAt(j - 1));
}
}
return dp[m - 1][n - 1];
}
}
2.1、题目2
剑指 Offer 49. 丑数
2.2、解法
这题看题解才做出来的,不太懂动态规划,最近研究以下。
2.3、代码
class Solution {
public int nthUglyNumber(int n) {
int a=0,b=0,c=0;
int []dp = new int[n];
dp[0]=1;
for(int i=1;i<n;i++)
{
dp[i]=Math.min(Math.min(dp[a]*2,dp[b]*3),dp[c]*5);
if(dp[i]==dp[a]*2) a++;
if(dp[i]==dp[b]*3) b++;
if(dp[i]==dp[c]*5) c++;
}
return dp[n-1];
}
}
3.1、题目3
剑指 Offer 60. n个骰子的点数
3.2、解法
3.3、代码
class Solution {
public double[] dicesProbability(int n) {
double[] dp = new double[6];
Arrays.fill(dp, 1.0 / 6.0);
for (int i = 2; i <= n; i++) {
double[] tmp = new double[5 * i + 1];
for (int j = 0; j < dp.length; j++) {
for (int k = 0; k < 6; k++) {
tmp[j + k] += dp[j] / 6.0;
}
}
dp = tmp;
}
return dp;
}
}