DFS算法实例

题目描述
									

小赛非常喜欢玩游戏,最近喜欢上了一个接金币的游戏。在游戏中,使用帽子左右移动接金币,金币接的越多越好,但是金币掉到地上就不能再接了。为了方便问题的描述,我们把电脑屏幕分成11格,帽子每次能左右移动一格。现在给电脑屏幕如图标上坐标:


也就是说在游戏里,金币都掉落在0-10这11个位置。开始时帽子刚开始在5这个位置,因此在第一秒,帽子只能接到4,5,6这三个位置中其中一个位置上的金币。问小赛在游戏中最多可能接到多少个金币?(假设帽子可以容纳无穷多个金币)。

输入

输入数据有多组。每组数据的第一行为以正整数n (0<n<100000),表示有n个金币掉在屏幕上上。在结下来的n行中,每行有两个整数x,T (0<T<100000),表示在第T秒有一个金币掉在x点上。同一秒钟在同一点上可能掉下多个金币。n=0时输入结束。输入数据以空格隔开

样例输入

7
6 3
8 2
9 3
7 1
6 2
5 1
7 2

输出

每一组输入数据对应一行输出。输出一个整数m,表示帽子最多可能接到m个金币。

样例输出

3

时间限制 C/C++语言:1000MS 其它语言:3000MS
内存限制 C/C++语言:65536KB 其它语言:589824KB




代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<array>
using namespace std;

int result = 0;
vector<int> ans;
int dfs(int x, int y, vector<vector<int>> &matrix, vector<vector<int>>& dp);
int maxi = 0;

int main()
{
	int coinNums = 0, i = 0;
	int   time = 0, point = 0;
	cin >> coinNums;
	vector<int> b(11, 0);
	int maxtime = 0;
	vector<int> cur, cur1;
	
	while (coinNums>i)
	{

		cin >> point >> time;
		maxtime = maxtime<time ? time : maxtime;
		cur.push_back(point);
		cur1.push_back(time);
		i++;
	}

	vector<vector<int>> matrix(maxtime + 1, b);
	// vector<int> b(matrix[0].size(),0);
	 vector<vector<int>> dp(matrix.size()+1, b);
	for (int i = 0; i<coinNums; i++)
	{
		matrix[cur1[i]][cur[i]] += 1;
		
	}

  cout<< dfs(0, 5, matrix, dp)<<endl;
  return 0;


}



int dfs(int x, int y, vector<vector<int>> &matrix, vector<vector<int>> &dp)
{
	

	if (x ==( matrix.size()-1))
	{
		maxi=maxi>dp[x][y]?maxi: dp[x][y]; 
		return maxi;
	}

	vector<vector<int>> dirs = { { 1,-1 },{ 1,0 },{ 1,1 } };

	for (auto &dir : dirs)
	{
		int xx = x + dir[0];  int yy = y + dir[1];
		if ( yy>=matrix[0].size() || yy<0) continue;
	
		dp[xx][yy] = dp[x][y] + matrix[xx][yy];
		
		dfs(xx, yy, matrix, dp);
	}

	return maxi;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值