70分求助 思路:map排序,再dp
查看原帖
70分求助 思路:map排序,再dp
579182
DarPluto_9楼主2022/8/29 18:39
#include <iostream>
using namespace std;
#include <map>  //将点按照值的升序进行排列[考虑dp的无后效性]
typedef pair<int, int> PII;
map<int, PII> mp;  //第一个为该点的值,第二个为该点坐标
const int N = 110;
int g[N][N];
int f[N][N];
int r, c;
int main()
{
	scanf("%d%d", &r, &c);

	for (int i = 1; i <= r; ++i)
	{
		for (int j = 1; j <= c; ++j)
		{
			f[i][j] = 1;  //最开始长度为自己
			scanf("%d", &g[i][j]);
			mp.insert({ g[i][j], { i,j } });
		}
	}

	//从小到大遍历mp,更新长度
	int res = 0;
	int dx[] = { -1,1,0,0 }, dy[] = { 0,0,-1,1 };
	for (auto& t : mp)
	{
		//值
		int v = t.first;
		//坐标
		int x = t.second.first, y = t.second.second;
		//更新f[x][y]
		for (int i = 0; i < 4; ++i)
		{
			int a = x + dx[i], b = y + dy[i];
			if (v > g[a][b])
				f[x][y] = max(f[x][y], f[a][b] + 1);
		}
		//更新res
		res = max(res, f[x][y]);
	}
	printf("%d", res);
	return 0;
}
2022/8/29 18:39
加载中...