共计 696 个字符,预计需要花费 2 分钟才能阅读完成。
题目
一名经验丰富的大盗,打算洗劫一条街上的店铺。
这条街上一共有 N 家店铺,每家店中都有一些现金。大盗事先踩点得知,如果他同时洗劫两家相邻的店铺,街上的报警系统就会自动启动,然后警察就会蜂拥而至。
作为会编程的你,为了帮助警察破案,请你计算下,这名大盗今晚最多可以盗窃多少现金。
输入描述
输入的第一行是一个整数 T,表示一共有 T 组数据。
接下来的每组数据,第一行是一个整数 N,表示一共有 N 家店铺。
第二行是 N 个被空格分开的正整数,表示每一家店铺中的现金数量。每家店铺中的现金数量均不超过 1000。
输出描述
对于每组数据,输出一行。该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。
样例
输入:
2 3 1 8 2 4 10 7 6 14
8 24
数据范围
T≤50,1≤N≤100000
样例解释
对于第一组样例,选择第 2 家店铺行窃,获得的现金数量为 8。
对于第二组样例,选择第 1 和 4 家店铺行窃,获得的现金数量为 10+14=24。
题解
#pragma GCC optimize(3)
#include
#include
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while(t--){
int n;
cin >> n;
int *l = new int[n+1], *f = new int[n+1];
memset(l,0,sizeof(l));
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++) cin >> l[i];
f[1] = l[1];
for(int j=2;j<=n;j++){f[j] = max(f[j-1], f[j-2]+l[j]); } cout <