8462:大盗阿福 总时间限制: 1000ms 内存限制: 65536kB 描述 阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。 这条街上一共有 N 家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。 作为一向谨慎作案的大盗,阿福不愿意冒着被警察追捕的风险行窃。他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金? 输入 输入的第一行是一个整数 T (T <= 50) ,表示一共有 T 组数据。接下来的每组数据,第一行是一个整数 N (1 <= N <= 100, 000) ,表示一共有 N 家店铺。第二行是 N 个被空格分开的正整数,表示每一家店铺中的现金数量。每家店铺中的现金数量均不超过 1000 。 输出 对于每组数据,输出一行。该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。 样例输入 2 3 1 8 2 4 10 7 6 14 样例输出 8 24 程序:
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <string.h>
using namespace std;
int t,n,a[1000001],f[1000001],maxn;
int main()
{ scanf("%d",&t);
for(int i=1;i<=t;i++)
{ scanf("%d",&n);
for(int j=1;j<=n;j++)
scanf("%d",&f[j]); a[1]=f[1];
for(int j=2;j<=n;j++)
a[j]=max(f[j]+a[j-2],a[j-1]);
printf("%d\n",a[n]>a[n-1]?a[n]:a[n-1]);
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
}
return ;
}
缩进没注意,请多原谅。 题目就是说你要去一条街上偷东西,而如果你连续偷了两家相邻的警察就会来,所以你要在不惊动警察的情况下偷得最多的钱。 题目会给你一个T,表示一共有T组数据,接下来就是T行,分别是每组数据,会给你一个N表示有N家店铺,对于每组数据输出一个最优解。 我先来解释一下样例: 输入两组数据第一组为1 8 2,可以偷的为8或1+2=3,而我们又要最优解所以输出8。 第二组输入 10 7 6 14,可以偷的为10、7、6、14、10+6=16、7+14=21、10+14=24.根据题意输出24. 接下来看程序 这道题是一道简单的动态规划。首先,输入数据,我们用数组a来存放最优解,数组f来存放数据,j从2开始一直循环到n,去寻找每个店铺的最优解,就是去寻找每个店铺的最优解,分段去决策,当我们得到了a[2]的最优解后,就可以去寻找a[3]的最优解,而每个阶段所作的决策,都会去影响以后的发展。最后,我们在第n个决策,和第n-1个决策里寻找最优解,然后输出。
这道题本来只是一道水题,所以讲的有问题的地方请在私信里指出。
NOI-Openjudge-8462