你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
問題解釋
房屋用非負整數陣列表示,house[len],房屋數量為len。
我們知道不偷取相鄰的房屋且首尾房屋不能同時偷取,那麼len間房屋最多可以偷取len/2間。
問題分析
想要知道當偷取len/2間房屋時的最高金額,可以假設當小偷偷取的最後一間房的位置是確定的,假設為last那麼問題變成求得偷取剩餘len/2-1間房的最高金額,最後把結果加上**house[last]**即可
我們建立乙個int型陣列select[len/2][len],並假設house=,len=7
子問題分析
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;i2*(i-1);t--)
select[i][j]=max+house[j];
if(select[i][j]>res)
res = select[i][j];
}else
select[i][j]=max+house[j];
if(select[i][j]>res)
res = select[i][j];}}
}
簡單粗暴地理解動態規劃
動態規劃可以說是做題時比較難以理解的演算法了,我之前也不是很理解,直到在隨機過程中學習了馬爾科夫過程後,再看動態規劃就覺得很簡單了。本文只是幫助簡單粗暴的理解動態規劃,熟練地運用需要親自進行大量的習題練習。一 動態規劃適合解決什麼樣的問題?1 問題具有最優子結構 舉乙個直白易懂的例子 求你走路的時候...
如何簡單的理解動態規劃?
動態規劃是一種類似於回溯的思想,他通過空間換時間的方法提高效率,一般用於求最優解問題。在上面我說道,動態規劃其實和回溯很類似。回溯思想在前面的文章我提到過,回溯是一種窮舉可能的方法。動態規劃則是通過額外的空間將回溯的遞迴樹中不需要的可能提前剪除達到提高效率的目的。我們來回憶一下回溯能解決的問題的特徵...
簡單理解演算法篇 動態規劃
動態規劃方法通常用來求解最優化問題,這些問題有很多種解,但我們希望尋求最優解。滿足兩個條件既可以使用動態規劃 1.具有最優子結構 2.子問題重疊 至於這兩點是什麼意思?先看個問題 現在有個鋼筋長度和 對應的表,問 給你個長度為n的鋼筋怎麼賣最划算?長度1 2 3 4 5 6 7 8 9 10 1 5...