与上一题基本一样,只不过房间形成一个环,就需要在首尾考虑状况多一些 这不是多一些状况的问题,是完全不知道如何选择的问题 这种状况详细分析一下就是要分成三种情况
第一种:不考虑首元素,也不考虑尾元素,只考虑中间的元素,那么中间的元素只需要按照上一题的方式来考虑就可以了,因为剔除了首尾元素,肯定就不会出现连续抢劫店家的情况 第二种:不考虑尾元素,只考虑从到倒数第二家的情况 第三种:不考虑首元素,只考虑从第二家到最后一家的情况 这三种情况当中,第二种与第三种情况是包含了第一种情况的 只考虑第二种与第三种情况下,就会把一个环形问题转化成线性问题(同上一题一样了) 所以这个问题变变成去除尾元素的最值,与去除头元素最值的这两个值谁更大了
class Solution {
private :
int commonRob ( std:: vector< int > & values) {
if ( values. size ( ) == 1 ) {
return values. at ( 0 ) ;
}
int dp[ 101 ] ;
memset ( dp, 0 , sizeof ( dp) ) ;
dp[ 0 ] = values[ 0 ] ;
dp[ 1 ] = std:: max ( values[ 0 ] , values[ 1 ] ) ;
for ( int i = 2 ; i < values. size ( ) ; ++ i) {
dp[ i] = std:: max ( dp[ i - 2 ] + values[ i] , dp[ i - 1 ] ) ;
}
return dp[ values. size ( ) - 1 ] ;
}
public :
int rob ( vector< int > & nums) {
if ( nums. size ( ) == 0 ) {
return 0 ;
}
if ( nums. size ( ) == 1 ) {
return nums. at ( 0 ) ;
}
std:: vector< int > v1 ( nums. begin ( ) , nums. end ( ) - 1 ) ;
std:: vector< int > v2 ( nums. begin ( ) + 1 , nums. end ( ) ) ;
return std:: max ( commonRob ( v1) , commonRob ( v2) ) ;
}
} ;