2018.3.4 2、bcatch

2.接苹果(bcatch.pas/c/cpp) 
题目描述     很少有人知道奶牛爱吃苹果。农夫约翰的农场上有两棵苹果树(编号为 1 和 2),每一 棵树上都长满了苹果。奶牛贝茜无法摘下树上的苹果,所以她只能等待苹果从树上落下。但 是,由于苹果掉到地上会摔烂,贝茜必须在半空中接住苹果(没有人爱吃摔烂的苹果)。贝 茜吃东西很快,所以她接到苹果后仅用几秒钟就能吃完。 
 
    每一分钟,两棵苹果树其中的一棵会掉落一个苹果。贝茜已经过了足够的训练,只要站 在树下就一定能接住这棵树上掉落的苹果。同时,贝茜能够在两棵树之间快速移动(移动时 间远少于 1 分钟),因此当苹果掉落时,她必定站在两棵树其中的一棵下面。此外,奶牛不 愿意不停地往返于两棵树之间,因此会错过一些苹果。 
 
    苹果每分钟掉落一个,共 T(1<=T<=1000)分钟,贝茜最多愿意移动 W(1<=W<=30) 次。现给出每分钟掉落苹果的树的编号,要求判定贝茜能够接住的最多苹果数。开始时贝茜 在 1 号树下。 输入 第 1 行:由空格隔开的两个整数:T 和 W 
 
第 2..T+1 行:1 或 2(每分钟掉落苹果的树的编号) 输出     第一行:在贝茜移动次数不超过 W 的前提下她能接到的最多苹果数 样例输入 7 2 2 1 1 2 2 1 1 样例输出 6 数据范围限制 如题 【样例说明】 
 
      7 分钟内共掉落 7 个苹果——第 1 个从第 2 棵树上掉落,接下来的 2 个苹果从第 1棵 树上掉落,再接下来的 2 个从第 2 棵树上掉落,最后 2 个从第 1 棵树上掉落。 
 

      贝茜不移动直到接到从第 1 棵树上掉落的两个苹果,然后移动到第 2 棵树下,直到接 到从第 2 棵树上掉落的两个苹果,最后移动到第 1 棵树下,接住最后两个从第 1 棵树上掉 落的苹果。这样贝茜共接住 6 个苹果。

分界线---------------------------------------------------------------------------------------------------------------------------

所以说为什么农夫约翰家的奶牛都这么多才多艺啊。。所以说奶牛爱吃苹果嘛?!还会位移嘛?!还会百分百接苹果嘛?!

可以,强。

言归正传,这道题是一道动规的题,先前我的做法是把每次连续的位移(eg: 11111)转化为一个带数值的数组(eg:idn[0] = 5)

来做,结果华丽丽的打了137行,错了。

好吧我老老实实对每个苹果进行处理,定义状态f[i][j] 代表处理到第i个苹果,进行了j步位移。

总而言之就是位移吃到苹果多,或是不位移吃到苹果多

初始位置在1树,所以预处理是若开始时(编号为1)站在1树下不位移可以白吃多少个苹果。

后面就是看位移否,有一句要解释下:

                    f[i][j] = (a[i] == j % 2 + 1) + max(f[i - 1][j - 1],f[i - 1][j]);

这一行中()内表示看其中表达式是否成立,成立则为1,否则为0。

这里因为我们是从1号树开始走的,所以我们的奇数次位移一定是从1号树 -> 2号树,偶数次位移一定是从2号树 -> 1号树,

若是位移了一定是为了吃到一个苹果嘛,所以这样判断。

嗯嗯,就是这样。

代码:

#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN = 1005;
int f[MAXN][MAXN];//f[i][j]表示处理到i个苹果,j步下的 
int a[MAXN];
int main() {

int t,w;
cin>>t>>w;
for(int i = 1; i <= t; i++) {
cin>>a[i];
}
for(int i = 1;i <= t;i++) {
f[i][0] = f[i-1][0] + (a[i] == 1);//预处理,注意初始位置在1树 
for(int j = 1; j <= w; j++) 
{
f[i][j] = (a[i] == j % 2 + 1) + max(f[i - 1][j - 1],f[i - 1][j]);
}
}
int maxx=-1;
for(int i = 0; i <= w; i++) {//找最大值 
if(f[t][i] > maxx)
maxx = f[t][i];
}
cout << maxx;
return 0;
}

猜你喜欢

转载自blog.csdn.net/chang_yl/article/details/79435182
2
>&2
α2
2-2