其题意是,一个小偷要投钱,若连续偷两家的钱就会被发现,所以要求不被发现的情况下能得到的最多的钱数。
思路:由于要求钱数最多,且不被发现,就是考虑第i个银行抢不抢的问题,得到状态转移方程为:
b[i]=max(b[i-1],a[i]+b[i-2])
代码:
#include<iostream>
#include<cmath>
using namespace std;
long long int a[100001],b[100001];
int main()
{
long long int i,j,k,l,m,n,x,y,max1;
cin>>n;
for (k=1;k<=n;k++)
{
cin>>m;
for (i=2;i<=m+1;i++)
{
cin>>a[i];
b[i]=0;
}
b[1]=0;
b[0]=0;
for (i=2,max1=0;i<=m+1;i++)
{
b[i]=max(a[i]+b[i-2],b[i-1]);
if (b[i]>max1)max1=b[i];
}
cout<<max1<<endl;
}
}