假如你是一个劫匪,并且决定抢劫一条街上的房子,每个房子内的钱财数量各不相同。如果你抢了两栋相邻的房子,则会触发警报机关。求在不触发机关的情况下最多可以抢劫多少钱。
解析:
定义一个dp数组,用来储存抢劫到第i个房子时,可以抢劫的最大数量。用w数组表示每个房子的财产数量。抢劫到第i个房子时有两种可能:1.抢劫该房子,此时最大数量为dp[i-2]+w[i];2.不抢劫该房子,最大数量为dp[i-1]。则状态转移方程为dp[i]=max(dp[i-1],dp[i-2]+w[i]),临界条件为dp[1]=w[1]。
#include<bits/stdc++.h>
using namespace std;
const int N=1e+5;
int dp[N],w[N];
int n;
int main(){
cin>>n; //房子数量
for(int i=1;i<=n;i++)
cin>>w[i]; //每个房子内的财产数量
dp[1]=w[1];
for(int i=2;i<=n;i++)
dp[i]=max(dp[i-1],dp[i-2]+w[i]);
cout<<dp[n];
return 0;
}