DAG上的动态规划 - 算法竞赛入门经典 - 嵌套矩形问题

#include<iostream>
#include<cstring>

using namespace std;

int n;						// 矩形个数
bool edges[1001][1001];	    // 保存抽象出来的边集合
int arc[1001][2];			// 保存读入的矩形数据
int length[1001];			// 从矩形某一点出发得到的路径长度
int max(int a, int b)
{
	if (a > b) return a;
	else return b;
}
void init()
{
	memset(length, -1, sizeof(length));	// init 初始化函数 把路径和边重新初始化为空
	memset(edges, 0, sizeof(edges));
}
int dp(int i)
{
	int &ans = length[i];				// 采用刘汝佳的做法,声明一个 length[i]的引用 方便操作

	if (ans > 0)						// 如果算过了这条边 直接返回这个存好的值
		return ans;

	ans = 1;							// 没算过 假定就这一个点 路径长度为 1
	for (int j = 0; j < n; j++)
	{
		if (edges[i][j])
			ans = max(ans, dp(j) + 1);	// 状态转移方程 :  返回当前值 和 从该点出发能到达的下一个点 的路径长 + 1
	}
	return ans;							// 记得返回这个值 /(ㄒoㄒ)/~~
}
int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		cin >> n;
		init();
		for (int i = 0; i < n; i++)
			cin >> arc[i][0] >> arc[i][1];
		for (int i = 0; i < n; i++)
		{
			for (int j = 0; j < n; j++)
			{
				if (arc[i][0] < arc[j][0] && arc[i][1] < arc[j][1])	
					edges[i][j] = true;
				if (arc[i][1] < arc[j][0] && arc[i][0] < arc[j][1])
					edges[i][j] = true;
			}
		}
		
		for (int i = 0; i < n; i++)
			dp(i);

		int maxLen = -1;
		for (int i = 0; i < n; i++)
		{
			if (length[i] > maxLen)
			{
				maxLen = length[i];
			}
		}
		cout << maxLen << endl;
	}
	return 0;
}


2017 - 3 - 27 

NOIP 228 天

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值