Sample Input
2
3
1 8 2
4
10 7 6 14
Sample Output
8
24
思路:动态规划。对于一家店铺,阿福的选择有洗劫和不洗劫。动态转移方程为dp[i]=max(dp[i-2]+a[i],dp[i-1])。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+20;
int t,n,a[maxn],dp[maxn];//dp[i]表示盗取前i家商店所获现金的最大值
template<class T> T read()
{
T f=1,k=0;
char c=getchar();
while(c<'0' || c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9')
{
k=k*10+c-'0';
c=getchar();
}
return f*k;
}
int main()
{
t=read<int>();
while(t--)
{
n=read<int>();
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++) a[i]=read<int>();
dp[1]=a[1];
int ans=dp[1];
for(int i=2;i<=n;i++)
{
dp[i]=max(dp[i-2]+a[i],dp[i-1]);
ans=max(dp[i],ans);
}
cout<<ans<<endl;
}
return 0;
}