动态规划3

 这个是上图的表达式

一个动态规划问题,最重要的就是他的状态转移方程。

递归实现

记忆化搜索

动态规划

不同的状态,解法也是不同的

视频里的状态转移有点过于复杂,我也想到了另一种方法,也AC了。

也侧面反映了,状态转移方程的不同,可以一提多解。

就是选第一个,和不选第一个,这样方程更简洁更好懂。

public static int memo[];

    public static int robber(int[] nums,int begin){

        int len = nums.length;
        
        //这个递归要三个及三个元素以上才成立
        //别计算nums的长度。。。因为肯定是一样的
        
        //如果还有一个元素,begin是最后一个元素
        if(begin==len-1)
            return nums[begin];

        //begin,begin+1,两个元素
        if(begin==len-2){
            return nums[begin]>nums[begin+1]?nums[begin]:nums[begin+1];
        }

        if(begin>=len-2)
            return nums[begin];

        if(memo[begin]!=-1)
            return memo[begin];

        //选第一个和后面的
        int state1 = nums[begin]+robber(nums,begin+2);
        //不选第一个,直接选后面的
        int state2 = robber(nums,begin+1);

        if(state1>state2)
            memo[begin]=state1;
        else
            memo[begin]=state2;

        return memo[begin];



    }

    public int rob(int[] nums) {

        int len = nums.length;
        
        if (len==0)
            return 0;
        
        memo = new int [len];
        for(int i=0;i<len;i++)
            memo[i]=-1;
        
        return robber(nums,0);
        


    }

还是犯了很多错误啊。。。。。

213

337

309

原文地址:https://www.cnblogs.com/weizhibin1996/p/9260348.html