动态规划问题二简单理解

问题说明

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

问题解释
  1. 房屋用非负整数数组表示,house[len], 房屋数量为len
  2. 我们知道不偷取相邻的房屋且首尾房屋不能同时偷取,那么len间房屋最多可以偷取len/2间。
问题分析
  1. 想要知道当偷取len/2间房屋时的最高金额,可以假设当小偷偷取的最后一间房的位置是确定的,假设为last那么问题变成求得偷取剩余len/2-1间房的最高金额,最后把结果加上**house[last]**即可
  2. 我们创建一个int型数组select[len/2][len],并假设house={6, 10, 9, 19, 6, 7, 15},len=7
    • select[i][j]:表示共偷取i+1间房屋,且最后一间在第j号位置上时的金额数
    • 对于select[0]这一行:这一行代表的是偷取一间房屋,那么select[0][j]=house[j]
      在这里插入图片描述
    • 对于i=1的行,即偷取两间房屋,我们知道select[1][0],select[1][1]是没有意义的,因为当偷取两间房屋时,第二间房屋不能在第0号位置,同样也不能在第1号位置,因为两间房屋不能相邻。对于i=2的行来说同理
      在这里插入图片描述
子问题分析
1. 对于select数组剩余值如何求得
	* 举例分析:select[1][2]的值如何获得
	* select[1][2]表示偷取两间房屋,最后一间在第2号位置上
	* 那么第一间房屋只能在第0号位置上
	* select[1][2]=house[2] + select[0][0];
	* 
	* 那么再分析一个select[1][3]的值
	* select[1][3]: 第二间房屋在第3号位置上
	* 那么第一间房屋可以在第0号和第1号位置之间
	* 注意:若是第二间是最后一间房屋,
	* 	那么第一间房屋不能是第0号位置。
	* 我们获取第0号和第1号房屋金额的值:
	* 	select[0][0]和select[0][1]
	* 我们选取最大值和house[3]相加即可

在这里插入图片描述

select数组值获取代码

		int res = 0;//结果
        for(int i=1;i<len/2;i++){
            for(int j=2*i;j<len;j++){
                //给select数组赋值
                int max = 0;
                //当j落在最后位置时,不能计算第一个值
                if(j==len-1){
                    for(int t=j-2;t>2*(i-1);t--){
                        if(select[i-1][t]>max)
                            max = select[i-1][t];
                    }
                    select[i][j]=max+house[j];
                    if(select[i][j]>res)
                        res = select[i][j];
                }
                else{
                    for(int t=j-2;t>=0;t--){
                        if(select[i-1][t]>max)
                            max = select[i-1][t];
                    }
                    select[i][j]=max+house[j];
                    if(select[i][j]>res)
                        res = select[i][j];
                }

            }
        }
发布了11 篇原创文章 · 获赞 1 · 访问量 422

猜你喜欢

转载自blog.csdn.net/hhhghh_/article/details/104753922
今日推荐