dp初级入门必学,有南阳理工学院OJ的题在此:http://acm.nyist.net/JudgeOnline/problem.php?pid=16
简单dp,刘汝佳白书第一本,161页。稍微理解下就会了。。很easy
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
const int maxn = 15;
struct Node
{
int x, y;
}node[maxn];
int cmp(Node a, Node b)
{
if (a.y == b.y)
return a.x > b.x;
return a.y > b.y;
}
int main()
{
int N;
int dp[maxn];
scanf("%d", &N);
while (N--)
{
int n;
scanf("%d", &n);
int i, j;
for (i=0; i<n; i++)
{
int tmpa, tmpb;
scanf("%d %d", &tmpa, &tmpb);
node[i].x = min(tmpa, tmpb);
node[i].y = max(tmpa, tmpb);
}
sort(node, node+n, cmp);
for (i=n-1; i>=0; i--)
{
dp[i] = 1;
for (j=n-1; j>i; j--)
{
if (node[j].x < node[i].x && node[j].y <=node[i].y)
if (dp[i] < dp[j] + 1)
dp[i] = dp[j] + 1;
}
}
int max = 0;
for (i=0; i<n; i++)
if (dp[i] > max)
max = dp[i];
printf("%d\n", max);
}
return 0;
}