您的位置:首页 > 其它

nyoj 16 最长上升子序列变形

2015-07-15 19:18 218 查看
经典矩形嵌套问题,先排序再求LIS。

需要注意在枚举j的时候x和y都要小于i才行。

#include <algorithm>
#include <cstdio>
using namespace std;

const int N = 1000;
int dp
;

struct Node
{
int x, y;
bool operator < ( const Node & o ) const
{
if ( x != o.x ) return x < o.x;
return y < o.y;
}
} node
;

int main ()
{
int t;
scanf("%d", &t);
while ( t-- )
{
int n;
scanf("%d", &n);
for ( int i = 0; i < n; i++ )
{
scanf("%d%d", &node[i].x, &node[i].y);
if ( node[i].x > node[i].y )
{
swap( node[i].x, node[i].y );
}
}
sort( node, node + n );
int ans = -1;
for ( int i = 0; i < n; i++ )
{
dp[i] = 1;
for ( int j = 0; j < i; j++ )
{
if ( node[j].x < node[i].x && node[j].y < node[i].y )
{
dp[i] = max( dp[i], dp[j] + 1 );
}
}
ans = max( ans, dp[i] );
}
printf("%d\n", ans);
}
return 0;
}


也可以根据矩形的嵌套关系建图,然后用拓扑排序+dp或者是逆向建图记忆花搜索来求解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: