抓苹果

问题 K: 抓苹果

时间限制: 1 Sec  内存限制: 128 MB

题目描述

告诉你一个鲜为人知的事实:奶牛喜欢吃苹果。农夫约翰有编号为 1 和 2 的两棵苹果树,每棵树上都结满了苹果。贝西够不着树上的苹果,所以她必须等它们落到地上。然而,她必须在苹果落地之前接住它们(苹果掉在地上就被摔坏了,没有人爱吃坏苹果)。贝西吃东西的速度很快,可以在几秒钟内吃完一只苹果。

    在每一分钟,两棵苹果树中的一棵会掉下一只苹果。贝西训练有素,只要她站在树下就能接到掉下来的苹果。尽管贝西可以快速地在两棵树之间行走(远不需要一分钟),但是她每一分钟只能站在一棵树下。此外,由于奶牛们的运动训练不足,所以她不高兴在两棵树之间无止尽地走来走去,就算这样就失去一些苹果也一样。

    每分钟掉落一个苹果,一直会持续T (1 ≤ T ≤ 1000)分钟,贝西最多愿意来回奔波W (1 ≤ W ≤ 30)次。给出每分钟苹果掉落地情况,确定贝西可以抓到的最大苹果数量。贝西一开始在 1 号树下。

输入

第一行:两个用空格分开的整数:T和W

第二行到第T + 1行:表示在这一分钟内哪棵树上的苹果将掉落

输出

第一行:贝西在移动不超过W次的条件下能够抓到的最大苹果数量

样例输入

7 2 2 1 1 2 2 1 1

样例输出

6

提示

(一共有七个苹果,第一个从 2 号树上掉落,(贝西可以抓住六个苹果:首先待在 1 号树其次是 1 号树上掉落两个,接下来是 2 号树上掉落两个,最后1 号树上落下最后两个,而贝西只想移动两次)下得到两个,再移动到 2 号树下抓住两个,再返回 1 号树,抓住最后两个)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#define V   1005
#define INF (1<<20)+5
typedef long long LL;
//#define LL long long[105]
using namespace std;
int n,m,a[V],t,w;
int f[V][V][5],s[V][V],g[V][V];
int main()
{
   // freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
   //freopen("bcatch.in","r",stdin);freopen("bcatch.out","w",stdout);
   cin>>t>>w;
   int ans=0;
   for(int i=1;i<=t;i++)
   {
        cin>>a[i];
       
   }
   if(a[1]==1)
   f[1][0][1]=1;
   else
   f[1][1][2]=1;
   for(int i=2;i<=t;i++)
   if(a[i]==1)
        for(int j=0;j<=min(i,w);j++)
        {
          f[i][j][1]=max(f[i-1][j][1]+1,f[i-1][j-1][2]+1);  
          f[i][j][2]=max(f[i-1][j][2],f[i-1][j-1][1]);   
          ans=max(max(f[i][j][2],f[i][j][1]),ans);   
        } 
        else
        {
           for(int j=0;j<=min(i,w);j++)
            {
              f[i][j][2]=max(f[i-1][j][2]+1,f[i-1][j-1][1]+1);  
              f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][2]); 
              ans=max(max(f[i][j][2],f[i][j][1]),ans);        
            }   
        }
    cout<<ans<<endl;    
    
   
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值