动态规划解决经典问题

动态规划的思想对于解决最优问题通常非常有效,用动态规划解决的问题通常具备两个基本特性:最优子结构和重复子问题;这两个特性确保问题可以被切分为更小的问题,在数学上的体现就是递推式,所以假如一个问题的解决方案可以抽象为一个递推式,则该问题用动态规划解决通常会非常有效,一个简单的例子就是斐波那契额数列;其变种包括:一只青蛙每次可以跳一步或两步,则跳N步有几种方案;下面我们来看一下LeetCode上的几个用动态规划解决的例子:

Palindrome Patitioning II: https://oj.leetcode.com/problems/palindrome-partitioning-ii/

在该例子中,采用了一个辅助数组cuts,其中cuts[i]记录的是s[0] ~ s[i-1]之间的最小cut数加1,所以我们最后只需要返回s[s.length()]-1;

<span style="font-size:12px;">public class Solution {
    public int minCut(String s) {
        if(s == null || s.length() == 0)
            return 0;
        int len = s.length();
        int[] cuts = new int[len+1];
        boolean[][] matrix = new boolean[len][len];
        
       for(int i = 0;i <= len; i++){
           cuts[i] = i;
       }
       for(int j = 0; j < len; j++){
           for(int i = j; i >= 0; i--){
               if((j-i < 2 || matrix[i+1][j-1]) && s.charAt(i) == s.charAt(j)){
                   matrix[i][j] = true;
                   cuts[j+1] = Math.min(cuts[j+1], cuts[i]+1);
               }
           }
       }
       return cuts[len]-1;
    }
}</span>
未完待更新。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值