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<c&&b<d或者a<d&&b<c。例如矩形(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)内。你的任务是选出尽量多的矩形排成一行,使得除了最后一个矩形外,每一个矩形都可以嵌套在下一个矩形之内。
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 <bits/stdc++.h>
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;
}