【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了

下附代码

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <fstream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cmath>
 7 using namespace std;
 8 ifstream fin("bcatch.in");
 9 ofstream fout("bcatch.out");
10 int DP[2][1003][33]={0};//现在在第i棵树,现在落下的是第j个苹果,还剩k次移动机会
11 int apple[1003]={0};//第i个苹果从哪棵树落下
12 int apples=0,chances=0;
13 int main(void)
14 {
15  fin>>apples>>chances;
16  int a=0,ans=0;
17  for(int i=1;i<=apples;i++)
18     {
19      fin>>a;
20      if(a==1)apple[i]=0;
21      if(a==2)apple[i]=1;
22     }
23  memset(DP,0xff,sizeof(DP));
24  DP[0][0][chances]=0;
25  for(int j=0;j<=apples;j++)
26     {
27      for(int i=0;i<=1;i++)
28         {
29          if(j==0&&i==1)continue;
30          for(int k=0;k<=chances;k++)
31             {
32              if(DP[i][j][k]<0)continue;
33              ans=max(ans,DP[i][j][k]);
34              if(apple[j+1]==i)
35                {
36     DP[i][j+1][k]=max(DP[i][j][k]+1,DP[i][j+1][k]);
37                 if(k>=1)DP[!i][j+1][k-1]=max(DP[i][j][k],DP[!i][j+1][k-1]);
38     }
39              else 
40              {
41               DP[i][j+1][k]=max(DP[i][j][k],DP[i][j+1][k]);
42               if(k>=1)DP[!i][j+1][k-1]=max(DP[i][j][k]+1,DP[!i][j+1][k-1]);
43              }
44            }
45        }
46     }
47  fout<<ans;
48  return 0;
49 }
View Code


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

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

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

摘歌词来做结尾好了:

甘い香りの果実の味は

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

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

转载于:https://www.cnblogs.com/CYWer/p/5627034.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值