【USACO】接住苹果

时间:2023-03-09 14:45:41
【USACO】接住苹果

接住苹果
奶牛喜欢吃苹果。约翰有两棵苹果树,有 N 只苹果会从树上陆续落下。如果掉苹果的时候,贝西在那棵树下,她就能接住苹果。贝西一开始在第一棵树下。在苹果掉落之前,她有足够的时间来回走动,但她很懒,最多只愿意移动 K 次。请计算一下她最多可以接住几只苹果。
输入格式
• 第一行:两个整数 N 和 K,1 ≤ N ≤ 1000; 1 ≤ K ≤ 30
• 第 i + 1 行有一个整数 Ti,表示第 i 只苹果从哪棵树上掉落,1 表示从第一棵树,2 表示从第二棵树
输出格式
• 单个整数:表示能接住的最大苹果数量
样例输入
7 2
2
1
1
2
2
1
1
样例输出
6
解释
先待在第一棵树下接住两个,然后移动到第二棵树下接住两个,再返回第一棵树接住最后两个

作为一个智障只能刷刷这种题了然而这种题我都写了一天觉得我自己吃枣药丸。

PJ标准水准DP但是我已经不可能去考PJ了

下附代码

 #include <algorithm>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <cmath>
using namespace std;
ifstream fin("bcatch.in");
ofstream fout("bcatch.out");
int DP[][][]={};//现在在第i棵树,现在落下的是第j个苹果,还剩k次移动机会
int apple[]={};//第i个苹果从哪棵树落下
int apples=,chances=;
int main(void)
{
fin>>apples>>chances;
int a=,ans=;
for(int i=;i<=apples;i++)
{
fin>>a;
if(a==)apple[i]=;
if(a==)apple[i]=;
}
memset(DP,0xff,sizeof(DP));
DP[][][chances]=;
for(int j=;j<=apples;j++)
{
for(int i=;i<=;i++)
{
if(j==&&i==)continue;
for(int k=;k<=chances;k++)
{
if(DP[i][j][k]<)continue;
ans=max(ans,DP[i][j][k]);
if(apple[j+]==i)
{
DP[i][j+][k]=max(DP[i][j][k]+,DP[i][j+][k]);
if(k>=)DP[!i][j+][k-]=max(DP[i][j][k],DP[!i][j+][k-]);
}
else
{
DP[i][j+][k]=max(DP[i][j][k],DP[i][j+][k]);
if(k>=)DP[!i][j+][k-]=max(DP[i][j][k]+,DP[!i][j+][k-]);
}
}
}
}
fout<<ans;
return ;
}

好好好现在是老司机开车时间。

大概是被某对已经离婚许久的组合影响我做这题的时候一直是hhhhhhhh的状态

歌曲名是《sweetest apple》一听名字就十分牙白的糟糕曲子

摘歌词来做结尾好了:

甘い香りの果実の味は

(Just I wanna eat you.You are only forbidden fruit)

噛み砕き味わうほど苦くなる