航线设置
问题描述:
美丽的莱茵河河畔. 每边都有着N个城市,
并且每个城市都有唯一的对应有好城市. 因为莱茵河经常大雾天气
要制定航线, 每个航线不可以交叉. 现在要你求出最大的航线数目.
输入:
有若干组测试数据,
每组测试数据第一行输入n, 接着n行输入a,b表示a城市,b城市联通. (1<= n
<= 1000)
输出:
最大的航线数.
输入例子:
4
1 2
2 4
3 1
4 3
8
1 3
4 4
3 5
8 6
6 8
7 7
5 2
2 1
输出例子:
2
3
解题思路:
1. 先将全部的a,b城市按照a的大小从小到大排序.
2. 做动态规划题目步骤:
(1).找转移状态: dp[i]: 表示当前i个城市的最大升序的长度.
(2).状态转移方程:
当dp[i] > dp[j] (i
>= j)
dp[i] = max(dp[i],dp[j]+1);
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
#define MAX 1005
struct nodeN
{
int a, b;
}node[MAX];
int n;
int dp[MAX]; //dp[i]: 表示当前i个最大升序的长度.
int cmp(const void *a,const void *b)
{
return (*(nodeN*)a).a - (*(nodeN*)b).a;
}
inline int max(int a,int b)
{
return a > b ? a : b;
}
int main()
{
int i, j;
freopen("input.txt","r",stdin);
while(scanf("%d",&n) !=
EOF)
{
for(i = 1; i <=
n; ++i)
{
scanf("%d
%d",&node[i].a,&node[i].b);
dp[i] =
1; //只有一个时升序序列的长度为1.
}
qsort(node+1,n,sizeof(node[0]),cmp);
int result = 0;
for(i = 1; i <=
n; ++i)
{
for(j = 1; j
<= i; ++j)
{
if(node[i].b
> node[j].b) //当node[i].b
> node[j].b表示当前i到j时满足升序.
{
dp[i]
= max(dp[i],dp[j]+1); //dp[i] 与 dp[j]+1取大.
}
}
result =
max(result,dp[i]);
}
printf("%d\n",result);
}
return 0;
}