题解 | #打家劫舍(二)#从打家劫舍(一)的思路中得出
打家劫舍(二)
https://www.nowcoder.com/practice/6a8b2ceb3f8f4e5891939d7d7cbbd2c4
#include <iostream> #include <vector> using namespace std; const int N = 200010; int a[N]; int n; int main() { cin>>n; for(int i = 0;i<n;i++) { scanf("%d",&a[i]); } vector<int>f(n),g(n);//f代表的是i是被选的,以i为结尾的金额最大,g代表的是i的不被选,以i为结尾的金额最大的。 int ret = f[0] = a[0]; for(int i = 1;i<n-1;i++) { f[i] = g[i-1]+a[i]; g[i] = max(f[i-1],g[i-1]); ret = max(ret,max(f[i],g[i])); } f[1] = a[1],g[1] = 0; int ans = 0; for(int i = 2;i<n;i++) { f[i] = g[i-1]+a[i]; g[i] = max(f[i-1],g[i-1]); ans = max(ans,max(f[i],g[i])); } printf("%d\n",max(ret,ans)); return 0; }