苹果捕捉

描述

这是一个鲜为人知的事实,牛爱苹果。农夫约翰有两棵苹果树(方便地编号1和2)在他的领域,每个苹果。Bessie在树上不能到达苹果,所以她必须等待他们掉下来。但是,当苹果撞到地面时,她必须在空中抓住他们(没有人想要吃伤痕的苹果)。Bessie是一个快速的食客,所以一个苹果,她抓住,只需几秒钟就可以吃了。

每分钟,两只苹果树中的一只掉下苹果。贝西,有很多的练习,可以抓住一个苹果,如果她站在一棵树下,一个人跌倒。而Bessie可以快速地在两棵树之间走走(不到一分钟),她可以随时站在一棵树下。此外,奶牛没有多少运动,所以她不愿意无休止地在树林之间来回走动(因而错过了一些苹果)。

对于T(1 <= T <= 1,000)分钟,苹果落下(每分钟一次)。Bessie愿意来回走动W(1 <= W <= 30)次。给定哪一棵树每分钟会放下一个苹果,确定Bessie可以捕获的最大苹果数量。Bessie从树1开始。

输入

*行1:两个空格分隔的整数:T和W

*行2..T + 1:1或2:每分钟将丢弃一个苹果的树。

产量

  • 1号线:Bessie无需步行超过W次的最大数量。

样品输入

7 2
2
1
1
2
2
1
1

样品输出

6

暗示

输入细节:

七个苹果落下 - 一个来自树2,然后从树1连续两个,然后从树2连续两个,然后从树1连续两个。贝西愿意从一棵树走到另一棵树两次。

输出细节:

Bessie可以通过停留在树1下,直到前两个下降,然后移动到下一个2的树2,然后返回到树1,最后两个。

题意解释分析

一共有 2 棵苹果树,Bessie站在其中一棵苹果树下等待苹果落下,由于任意一个时刻只能站在一棵树下,从一棵树移动到另外一棵树的时间不计,Bessie不愿意太频繁移动,现在给定苹果的下落次序和最大移动次数,问Bessie最多可以抓住几个苹果?

代码

#include <stdio.h>
#include <iostream>
using namespace std;

int num[1005];
int dp[1005][35][2];

int main()
{

    int n, times, maxsum = -1;
    scanf("%d%d", &n, &times);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &num[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        dp[i][0][0] = dp[i - 1][0][0] + (num[i] == 1);
        dp[i][0][1] = dp[i - 1][0][1] + (num[i] == 2);
        for (int j = 1; j <= times; j++)
        {
            dp[i][j][0] = max(dp[i - 1][j - 1][1], dp[i - 1][j][0]) + (num[i] == 1);
            dp[i][j][1] = max(dp[i - 1][j - 1][0], dp[i - 1][j][1]) + (num[i] == 2);
            maxsum = max(maxsum, max(dp[i][j][0], dp[i][j][1]));
        }
    }
    printf("%d\n", maxsum);
    return 0;
}

测试截图

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值