题目大意:
就是一个小偷偷东西,然后不能偷相邻的两家店铺听说他一偷相邻的两家店铺的现金,警报系统就响了,然后警察就来了,然后小偷就直接狗带。
题目说每家店铺都有现金那我们就假设每家店铺都有现金吧。
【输入】
输入的第一行是一个整数T(T≤50) ,表示一共有T组数据。
接下来的每组数据,第一行是一个整数N(1≤N≤100,000) ,表示一共有N家店铺。第二行是N个被空格分开的正整数,表示每一家店铺中的现金数量。每家店铺中的现金数量均不超过1000。
【输出】
对于每组数据,输出一行。该行包含一个正整数,表示阿福在不惊动警察的情况下可以得到的现金数量。
【输入样例】
2
3
1 8 2
4
10 7 6 14
【输出样例】
8
24
【提示】
对于第一组样例,阿福选择第2家店铺行窃,获得的现金数量为8。
对于第二组样例,阿福选择第1和4家店铺行窃,获得的现金数量为10+14=24。
解题思路:
你们可以做一下草稿,理解我列出来的动态转移方程(动态转移方程在下面)。
首先,我们理解一下题目,也就是说所有店铺都有现金,也就是说,如果有5间店铺,
先偷第一间是肯定的,所以第二次是偷第三间呢还是第四间呢(不直接跳到第五间,因为直接这样还不如偷第三间再偷第五间,毕竟我们假设了每一间店铺都有现金),根据这点,我们列出动态转移方程:f[i]=max(f[i-2]+a[i],f[i-1]) i=2..n。
源程序:
#include<cstdio>
#define r(i,a,b) for (int i=a;i<=b;i++)//万能赋值
using namespace std;
int t,n;
int f[100001],a[100001]; //数组要定100000
int max(int x,int y) //比较两个值的大小,返回较大值
{
return x>y?x:y;
}
int main()
{
scanf("%d",&t);
r(j,1,t) //循环,等于for(int j=1;j<=t;j++)
{
scanf("%d",&n);
r(i,1,n) //循环(不懂看我的上一篇文章《鸡蛋的硬度》)
scanf("%d",&a[i]);
f[1]=a[1]; //第一间肯定偷啦
r(i,2,n)
f[i]=max(f[i-2]+a[i],f[i-1]);//你们可以草稿一下,这个动态转移方程应该很容易理解
printf("%d\n",f[n]); //输出不多说了
}
}
我是个菜鸟,大佬勿喷