ZCMU-1165: 忠哥的dp(I)

1165: 忠哥的dp(I)

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 146  Solved: 46
[Submit][Status][Web Board]

Description

 

 

有n个矩形,每个矩形可以用两个整数a,b描述,表示他的长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a

 

Input

 

 

多组测试数据。每组测试数据的第一行有一个正整数n(n<=1000)代表矩形的个数。接下来n行每行分别有两个正整数a,b(a,b<=100)代表每个矩形的长和宽。

 

Output

 

 

对于每组测试数据,输出一个整数代表最多能有几个矩形能够排成一行。

 

Sample Input

2

1 5

6 2

2

1 5

3 4

Sample Output

2

1

HINT

 

 

【解析】

动态规划.。当然也可以转化成DAG上的动态规划。

#include 
using namespace std;
struct tri
{
	int length;
	int width;
}t[1010];
bool cmp(tri a, tri b)
{
	if (a.length != b.length)
		return a.length < b.length;
	else if (a.length == b.length)
		return a.width < b.width;
}
int main()
{
	int n;
	while (~scanf("%d", &n))
	{
		int dp[1010];
		int ans = 0;
		for (int i = 0; i < n; i++)
		{
			int x, y;
			scanf("%d%d", &x, &y);
			if (x > y)
				t[i].length = x, t[i].width = y;
			else
				t[i].length = y, t[i].width = x;
		}
		sort(t, t + n, cmp);
		for (int i = 0; i < n; i++)
		{
			dp[i] = 1;
			for (int j = 0; j < i; j++)
			{
				if ((t[i].length > t[j].length) && (t[i].width > t[j].width))
					dp[i] = max(dp[i], dp[j]+1);
			}
			ans = max(ans, dp[i]);
		}
		printf("%d\n", ans);
	}

	return 0;
}

 

你可能感兴趣的:(oj,动态规划)