分析过程
最大子和
分析:
- 以f[i]结尾的序列,它所代表的最大值是
- f(i-1)+f(i)
- f(i-2)+f(i-1)+f(i)
- …
- f(1)+……+f(i-2)+f(i-1)+f(i)
- 如果他们同时减去f(i)那么值是不变的,所以就可以只考虑
- f(i-1)
- f(i-2)+f(i-1)
- …
- f(1)+……+f(i-2)+f(i-1)
- 的最大值
- 同时这个时候已经确保了s(i-1)为i-1为最后一个元素的最大值,所以只需要max(s(i-1),0)+f(i)
三角形
解码字母
题目
32. 最长有效括号
“….) )”+”…..( )”
https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode-solution/
300. 最长递增子序列
72. 编辑距离
518. 零钱兑换 II
class Solution {
public int change(int amount, int[] coins) {
int m = coins.length;
int[] dp = new int[amount+1];
dp[0] = 1;
for(int coin:coins) {
// j =coin 代表从使用一个coin开始
for(int j = coin; j <= amount; j ++) {
dp[j] += dp[j-coin];
}
for(int j = 0 ; j <= amount; j++) {
System.out.print(dp[j]+" ");
}
System.out.println();
}
return dp[amount];
}
}
664. 奇怪的打印机
第一种:dp[i][j] = 1 + dp[i + 1][j];//i单独打印, s[i + 1, j]段另外打印
//dp[i + 1][k]代表将i放到[i+ 1, k]一起打印,dp[k + 1][j]代表[k + 1, j]另外打印,(s[i] == s[k])
第二种:dp[i][j] = min(dp[i][j], dp[i + 1][k] + dp[k + 1][j]);
//dp[i + 1][j]代表将i放入[j + 1, i]一起打印(s[i] == s[j])
第三种:dp[i][j] = min(dp[i][j], dp[i + 1][j]);
class Solution {
public int strangePrinter(String s) {
int n = s.length();
if(n==0)
return 0;
int[][] dp = new int[n+1][n+1];
for(int i = 0 ; i < n; i++) {
dp[i][i] = 1;
}
for(int len = 2; len <= n ; len ++) {
for(int l = 0 ; l + len -1 < n ; l++) {
int r = l +len-1;
dp[l][r] = 1 + dp[l+1][r]; // 初始化为s[i]是画完[l+1,r]以后再画的
for(int k = l+1 ;k <= r;k++) {
if(s.charAt(k)==s.charAt(l)) {
dp[l][r] = Math.min(dp[l][r],dp[l+1][k]+dp[k+1][r]); // 以k为分界线,s[i]与s[k]假设是被一笔画出的
}
}
// if(s.charAt(l)==s.charAt(r)) dp[l][r] = Math.min(dp[l][r],dp[l+1][r]);
}
}
return dp[0][n-1];
}
}
10. 正则表达式匹配
class Solution {
public boolean isMatch(String s, String p) {
int m = s.length();
int n = p.length();
boolean[][] dp = new boolean[m+1][n+1];
dp[0][0] = true;
for(int i = 1; i+1 <= n ; i+=2) { // a*b*c的情况
if(p.charAt(i)=='*') {
dp[0][i+1] = true;
} else {
break;
}
}
for(int i = 1; i <= m; i ++) {
for(int j = 1 ; j <= n ; j++) {
if(p.charAt(j-1)=='.') {
// 注意要&&dp[i-1][j-1]
dp[i][j] = true && dp[i-1][j-1];
} else if(p.charAt(j-1)=='*') {
dp[i][j] = dp[i-1][j] && check(s.charAt(i-1),p.charAt(j-2));
if(j>=2)
dp[i][j] = dp[i][j] || dp[i][j-2];
// dp[i][j] = dp[i][j-2] || (dp[i-1][j] && s.charAt(i)==p.charAt(j-1));
} else {
if(s.charAt(i-1) == p.charAt(j-1))
// 注意要&&dp[i-1][j-1]
dp[i][j] = true && dp[i-1][j-1];
}
}
}
return dp[m][n];
}
boolean check(char a,char b) {
if(b=='.')
return true;
if(a==b)
return true;
return false;
}
}