nyoj 16 - 矩形嵌套

http://acm.nyist.net/JudgeOnline/problem.php?pid=16

很经典的dp题。。。刚开始想用贪心做,做了一半改成dp了,后来听说贪心貌似也可以。。。dp的话贪心前做的一些排序准备工作就没用了~~刚开始我用邻接矩阵存储结果内存达到了4000+,很不爽,又用vector优化了下,这才满意。大致思路:先将数据根据能否嵌套化为图的表示方法,一个DAG,然后在DAG上动态规划

dp方程:d(i) = max(d(j) + 1), (i, j) 属于图

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;

int num;
vector<int> ma[1005];
int x[1005], y[1005], d[1005];

int dp(int i)
{
int j;
int& ans = d[i];
if(ans > 0)
return ans;
ans = 1;
for(j = 0; j < ma[i].size(); j++)
{
int k = dp(ma[i][j]) + 1;
if(ans < k)
ans = k;
}
return ans;
}
int main()
{
int ncases, i, j, max;
scanf("%d", &ncases);
while(ncases--)
{
scanf("%d", &num);
for(i = 0; i < num; i++)
{
scanf("%d%d", &x[i], &y[i]);
}
memset(d, 0, sizeof(d));
for(i = 0; i < num; i++)
{
for(j = 0; j < num; j++)
{
if((x[i] < x[j] && y[i] < y[j]) || (x[i] < y[j] && y[i] < x[j]))
ma[i].push_back(j);
}
}
max = 0;
for(i = 0; i < num; i++)
if(max < dp(i))
max = dp(i);
printf("%d\n", max);
for(i = 0; i < num; i++)
{
if(ma[i].size() != 0)
ma[i].clear();
}
}
return 0;
}

 

你可能感兴趣的:(OJ)