题目描述就上图啦
#include <iostream>
#include <stdio.h>
#include <algorithm>
#define maxn 100
using namespace std;
int a[maxn];//a[i]表示城市i唯一对应的友好城市编号。
int m[maxn]; //表示从城市i开始后边可以设置的最大航空线条数。
int next[maxn];//表示下一条航线的开始位置。
/*
4
1 2
2 4
3 1
4 3
城市编号 1 2 3 4
友好城市a[i] 2 4 1 3
m[i] 2 1 2 1
next[i] 2 0 4 0
*///画出图形更好理解
int main(void)
{
int n;
int s,t;
while(cin>>n)
{
int i,j;
for(i = 0; i < n; i++)
{
cin>>s>>t;
a[s] = t;
}
for(i = 1; i <= n; i++)
{
m[i] = 1;
next[i] = 0;//初始化每个城市后边最少一条航空路线(从本地出发)初始化每个城市后边都没有后继
}
// cout<<n;
for(i = n-1; i >= 1 ; i--)
{
for(j = i+1; j <= n; j++)
{
if(a[i]<a[j] && m[i] <= m[j])//城市i的终点在城市j终点后面,而且城市i后的航线条数比城市j后边的条数少
{
m[i] = m[j]+1;
next[i] = j;//更新后继,让下一条航线的出发点放在j
// cout<<m[i]<<"<<<<"<<endl;
}
}
}
int maxx = m[1];
for(i = 2; i <= n ;i++)
{
maxx = max(maxx,m[i]);
}
cout<<maxx<<endl;
}
//cout << "Hello world!" << endl;
return 0;
}
又是一题动归,最大航线数是又每个城市允许的可以通行的航线数决定,即把一个求整体最大航线数的问题转化成求从每一个城市出发可以设置的航线数的最大值。
int a[maxn];//a[i]表示城市i唯一对应的友好城市编号。
int m[maxn]; //表示从城市i开始后边可以设置的最大航空线条数。
int next[maxn];//表示下一条航线的开始位置。
这个问题的核心部分就是数组m跟后继数组next。
通过看这个注释应该很好理解的,当然我们可以画出图来更好理解,我就用表格的形式给大家看一下
对这组样例
4
1 2
2 4
3 1
4 3
我们可以列出这个表格(最好是画出图来)
城市编号 1 2 3 4
友好城市a[i] 2 4 1 3
m[i] 2 1 2 1
next[i] 2 0 4 0
我们随后可以推出状态转移方程 m[i] = max(m[j])+1;
时间复杂度是n^2,亟待优化,我们一起思考,有思路了再回来写。