/*
【思路】:DP求出每一个状态的最优值,S[i]为盗窃前i家店铺的最优值,那么S[n]就是盗窃前n家店铺的最优值;
面临的每个抉择就是这个店铺盗还是不盗?那就从盗和不盗中选择一个最优值。
盗:S[i-2]+a[i];为前i-2家店铺的最优值+现在盗的店铺;
不盗:S[i-1];就是前S[i-1]家店铺的最优值;
最后输出S[n]
*/
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int A[100000];
int S[100000];
int main(int argc, char const *argv[])
{
int num;
cin>>num;
while(num --){
memset(S,0,sizeof(S));
int n;
cin>>n;
for (int i = 0; i < n; ++i)
{
cin>> A[i];
/* code */
}
for (int i = 0; i < n; ++i)
{
if (i == 0)
{
S[i] = A[i];
/* code */
}
else if(i == 1)
{
if (A[i]>A[i-1])
{
S[i] = A[i];
}
else{
S[i] = A[i - 1];
}
}
else{
if (A[i] + S[i-2] > S[i-1])
{
S[i] = A[i] + S[i-2];
}
else {
S[i] = S[i-1];
}
}
}
cout<< S[n-1]<<endl;
}
}
大盗阿福
最新推荐文章于 2022-06-14 00:33:24 发布