描述
这是一个鲜为人知的事实,牛爱苹果。农夫约翰有两棵苹果树(方便地编号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, ×);
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;
}