ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P2690 Apple Catching G

2021-11-06 10:00:15  阅读:147  来源: 互联网

标签:pre Apple int dfs Catching P2690 ans 移动 dp


题目链接

首先来个爆搜再说。

定义 dfs(int i,int pre,int ans) 表示当前是 \(i\) 时间,上一次在 \(\rm pre\) 苹果树,已经移动 \(\rm ans\) 次的最大苹果数量。

如果 i>t ,返回 \(0\) 即可。

如果上一次苹果树的位置跟当前一样,就不用移动,返回dfs(i+1,a[i],ans)+1

如果上一次跟当前位置不一样,可以不移动也可以移动,如果移动次数小于 \(w\) ,就可以选择移动。

这样你可以获得 \(0\) 分的好成绩!


考虑记忆化,定义 \(dp_{i,ans}\) 表示第 \(i\) 时间移动 \(\rm ans\) 次的最大苹果数量。

每次搜索的时候过滤掉搜过的值就行了


代码:

#include<bits/stdc++.h>
using namespace std;
int t,w;
int a[1005];
int dp[1005][35];
int dfs(int i,int pre,int ans){//当前时间,上一次位置,次数 

	if(i>t) return dp[i][ans]=0;
	if(pre==a[i]){
		return dp[i][ans]=dfs(i+1,a[i],ans)+1;
	}
	else{
		dp[i][ans]=dfs(i+1,pre,ans);
		if(ans<w){
			dp[i][ans]=max(dp[i][ans],dfs(i+1,a[i],ans+1)+1);
		}
		return dp[i][ans];
	}
}
int main(){
	memset(dp,-1,sizeof dp);
	cin>>t>>w;
	for(int i=1;i<=t;i++) cin>>a[i];
	int d=dfs(1,1,0);//因为你不知道你上一次位置是哪里
	memset(dp,-1,sizeof dp);
	int w=dfs(1,0,0);
	cout<<max(d,w)<<endl;
}

标签:pre,Apple,int,dfs,Catching,P2690,ans,移动,dp
来源: https://www.cnblogs.com/stOtue/p/15516046.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有