分析过程
最大子和

分析:
- 以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;}}

