JS禁止查看网页源代码的简单实现方法

【USACO】JZOJ,Luogu P2690 接苹果 (dp-线性动规)

同步于CSDN:戳这里QAQ

来源:Luogu P2690,JZOJ

1|0题目描述


很少有人知道奶牛爱吃苹果。农夫约翰的农场上有两棵苹果树(编号为 12), 每一棵树上都长满了苹果。奶牛贝茜无法摘下树上的苹果,所以她只能等待苹果 从树上落下。但是,由于苹果掉到地上会摔烂,贝茜必须在半空中接住苹果(没有人爱吃摔烂的苹果)。贝茜吃东西很快,她接到苹果后仅用几秒钟就能吃完。每一分钟,两棵苹果树其中的一棵会掉落一个苹果。贝茜已经过了足够的训练, 只要站在树下就一定能接住这棵树上掉落的苹果。同时,贝茜能够在两棵树之间 快速移动(移动时间远少于1分钟),因此当苹果掉落时,她必定站在两棵树其中的一棵下面。此外,奶牛不愿意不停地往返于两棵树之间,因此会错过一些苹果。苹果每分钟掉落一个,共 T1<=T<=1000 分钟,贝茜最多愿意移动 W1<=W<=30 次。现给出每分钟掉落苹果的树的编号,要求判定贝茜能够接住的最多苹果数。 开始时贝茜在1号树下。

2|0解题思路


  • 这应该还是一道较为基本的 dp,可以设置状态:dp[i][j] 表示前 i 个苹果移动 j 次可以接住的最多苹果数。
  • 至于状态转移方程,其实也没有什么可以多说的,如果 j0,也就是说移动 0 次,那么显而易见,dp[i][j] 肯定就是继承 dp[i1][j] 的值了;否则,就有两种选择:移动或不移动,在 dp[i1][j]dp[i1][j1] 中取较大值,那么怎么处理接到苹果呢?其实很简单,就是利用奇偶的性质,起点在编号为 1 的苹果树下,那么移动 1 次到 2 号,移动 2 次到 1 号,移动 3 次到 1 号……以此类推,如果移动次数为奇数,就在 2 号树下,反之在 1 号树下。
  • 那么就可以判断当前是否在掉落苹果的那棵树下:如果 j mod 2+1==a[i],显然贝茜能接到苹果,所以 dp[i][j]++;
  • 水一波弹幕~本博客同步发表于:戳这里QAQ

3|0Code


#include <bits/stdc++.h> using namespace std; int t,w; int a[10000],dp[5010][5010]; int main() { freopen("apple.in","r",stdin); freopen("apple.out","w",stdout); scanf("%d %d",&t,&w); for (int i=1;i<=t;i++) scanf("%d",&a[i]); for (int i=1;i<=t;i++) for (int j=0;j<=min(t,w);j++) { if (j==0) dp[i][j]=dp[i-1][j]; else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]); if (j%2+1==a[i]) dp[i][j]++; } int ans=-0xfffffff; for(int i=0;i<=w;i++) ans=max(ans,dp[t][i]); printf("%d",ans); return 0; }

__EOF__

本文作者Admin-zx
本文链接https://www.cnblogs.com/Michael-zx/p/12367925.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Z__X  阅读(266)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示