信息学奥赛一本通 1301:大盗阿福(同东方博宜OJ 2263 - 大盗)

题目描述

阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。

这条街上一共有 N 家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。

作为一向谨慎作案的大盗,阿福不愿意冒着被警察追捕的风险行窃。他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金?

输入

输入的第一行是一个整数 T (T≤50) ,表示一共有 T 组数据。

接下来的每组数据,第一行是一个整数 N (1≤N≤100000) ,表示一共有 N 家店铺。

第二行是 N 个被空格分开的正整数,表示每一家店铺中的现金数量。每家店铺中的现金数量均不超过 1000 。

输出

对于每组数据,输出一行。该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。

样例

输入
2
3
1 8 2
4
10 7 6 14
输出
8
24

几点注意都在代码里

话不多说

直接看AC代码

#include
using namespace std;
int a[100001],s[100001];//注意要初始化为100001
int main(){
	int i,n,m;
    cin>>m;
    while(m--)
    {
       cin>>n;
       for(i=1;i<=n;i++)
	   {
    	cin>>a[i];
	   }
	   s[1]=a[1];//求值数组初始化值
	   for(i=2;i<=n;i++)
	   {
		s[i]=max(a[i]+s[i-2],s[i-1]);//本题求值公式
	   }
	   cout<

解释一下求值公式

s[i]=max(a[i]+s[i-2],s[i-1]);

新的值有2种选择,哪个大选哪个

1.继承前一个数

2.加上自己的数,继承前一个数的前一个数

你可能感兴趣的:(算法,c++,动态规划)