首页 > 代码库 > NOI-Openjudge-8462-大盗阿福

NOI-Openjudge-8462-大盗阿福

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

NOI-Openjudge-8462-大盗阿福