首页 > 其他分享 >P1434 [SHOI2002] 滑雪

P1434 [SHOI2002] 滑雪

时间:2024-04-03 15:48:36浏览次数:33  
标签:滑雪 dj di int lenless ii P1434 include SHOI2002

链接:https://www.luogu.com.cn/problem/P1434
题目:

思路:找每个点的小于链的长度,存在lenless里;找每个点的大于链,存在于lengreat中。
然后两个相加,排序,选择最大的那个数字。注意这里长度要加1,因为没有加上自己的(初始数据设置成0)!
(按理说其实每个都少了1,所以应当全加1再排序,但是改变顺序不影响结果)
注意:这是一维数组为了便于排序,也就是numlst[i][j]转换为:i*c+j
额,怎么说呢,动态规划感觉确实像记忆化搜索(
代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
typedef long long ll;
using namespace std;



const int N = 110;
int r, c;
int numlst[N][N];
int lenless[N*N];
int lengreat[N * N];
int lenth[N * N];
int del[][2] = { {1,0},{-1,0},{0,1},{0,-1} };
int dfs(int i, int j,bool a)
{
	//找小于链的
	int ans = 0;
	if (!a)
	{
		if (lenless[i * c + j] != 0)
			return lenless[i * c + j];
		for (int ii = 0; ii < 4; ii++)
		{
			int di = i + del[ii][0], dj = j + del[ii][1];
			if (di >= 0 and di < r and dj >= 0 and dj < c)
			{
				if (numlst[di][dj] < numlst[i][j])
					ans = max(ans, dfs(di, dj, 0) + 1);
			}
		}
		return lenless[i * c + j] = ans;
	}
	else
	{
		if (lengreat[i * c + j] != 0)
			return lengreat[i * c + j];
		for (int ii = 0; ii < 4; ii++)
		{
			int di = i + del[ii][0], dj = j + del[ii][1];
			if (di >= 0 and di < r and dj >= 0 and dj < c)
			{
				if (numlst[di][dj] > numlst[i][j])
					ans =max(ans, dfs(di, dj, 1) + 1);//这里记录多方向的最大长度,也就是下一条链的长度+1
			}
		}
		return lengreat[i * c + j] = ans;
	}
	
}
int main()
{
	cin >> r >> c;
	for (int i = 0; i < r; i++)
		for (int j = 0; j < c; j++)
			cin >> numlst[i][j];
	memset(lenless, 0, sizeof(lenless));
	memset(lengreat, 0, sizeof(lengreat));
	memset(lenth, 0, sizeof(lenth));
	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			if (lenless[i*c+j] == 0)
			{
				dfs(i, j , 0);
			}
			if (lengreat[i * c + j] == 0)
				dfs(i, j, 1);
		}
	}
	for (int i = 0; i < c * r; i++)lenth[i] = lenless[i] + lengreat[i];
	sort(lenth, lenth + c * r);
	cout << lenth[c * r - 1] + 1 ;
	return 0;

}

标签:滑雪,dj,di,int,lenless,ii,P1434,include,SHOI2002
From: https://www.cnblogs.com/zzzsacmblog/p/18112802

相关文章

  • Poi2002滑雪者命名
    网络流#有源汇上下界费用流#最小点覆盖最小点覆盖问题这里可以直接有源汇上下界费用流//Author:xiaruize#ifndefONLINE_JUDGE#definedebug(x)cerr<<"OnLine:"<<__LINE__<<#x<<"="<<x<<endlboolstart_of_memory_use;#else#defi......
  • 基于Java的桃花峪滑雪场租赁系统(Vue.js+SpringBoot)
    目录一、摘要1.1项目介绍1.2项目录屏二、功能模块2.1游客服务2.2雪场管理三、数据库设计3.1教练表3.2教练聘请表3.3押金规则表3.4器材表3.5滑雪场表3.7售票表3.8器材损坏表四、系统展示五、核心代码5.1查询教练5.2教练聘请5.3查询滑雪场5.4滑雪场预......
  • 滑雪
    这道题目本来很简单主要是来看一下普通DP怎么做这个相当于形成了一个DAG这种矩阵成DAG的模型可以注意一下......
  • [SCOI2012] 滑雪
    Description给定一个带边权有向图。现在从点\(1\)开始走,走的过程中可以无代价回溯任意多步,求在经过最多点的情况下(重复的点算一次),最小边权和是多少。Solution先从点\(1\)BFS,能走到的点就是第一小问答案。根据回溯条件,在最优答案中,每条边至多走一次(考虑走两次的话,一定有一次......
  • 基于Python+Pygame实现一个滑雪小游戏
    目录项目介绍Pygame介绍项目文件夹介绍演示视频代码免费领取一、项目介绍使用介绍:运行main.py文件后,通过左右按键可以控制小人的移动,如果经过旗杆那么+10分,如果碰到树木那么减50分。二、Pygame介绍Pygame是一个用于游戏开发和多媒体应用的Python库。它是基于SDL(Simple......
  • P2573 [SCOI2012] 滑雪
    P2573bzoj#2753一开始以为最优答案就是最短路径树,结果发现是错的首先我们可以观察一下,发现时间胶囊的作用就是回到某个已经经过的节点,显然是一个最小生成树但是这道题还有高度的限制,我们在生成树的时候并不能把所有的边直接按照边权排序,因为这样的话可能会出现一些不合法的边......
  • 雾里滑雪笔记(三)热力学第一定律
    热一律及其衍生物一、热力学第一定律的基本内容热力学第一定律是能量守恒定律在一定条件下的表现形式。为了理解这种说法,我们考虑所有可能的形式的能量。系统的总能量可以分为三部分:系统在外力场中的势能或位能$V$,系统整体运动的动能$T$,和系统的内能,即热力学能$U$。$$E=......
  • 「刷题记录」 [SHOI2002] 百事世界杯之旅
    第一道有关极限期望的数学题,记录一下。我们设\(f_i\)是凑齐前\(i\)个球星期望需要买的饮料数。\[E=1\times\dfrac{n-i}{n}+2\times\dfrac{i}{n}\times\dfrac{n-i}{n}+3\times\left(\dfrac{i}{n}\right)^2\times\dfrac{n-i}{n}+4\times\left......
  • 滑雪 OJ3651
    这个题我是不会用dp做,众所周知,能用记忆化搜索的题肯定能用dp,能用dp的不一定用记忆化搜索.这个题正好用记忆化搜索可以过,欸嘿#include<bits/stdc++.h>usingnamespacestd;constintN=2020;intf[N][N],a[N][N],n,m,res;//a数组存储状态,f数组存储每条路最大的值intdx......
  • AcWing901. 滑雪(python)
    题目详情知识点记忆化DP思路自己的思路(仅参考):一开始想的是找最大值,然后从最大值开始向下滑,但是我们是要求最长路径,不一定是从最高的点滑下去的,也不一定是滑到最低点,而且会存在最大值不止一个的情况,所以我们应该是针对每一个点,都求出当前该点出发能去的最长路径,然后求完之后......