#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n;
//友好城市是用转化的思路,即将求合法建桥方式的最大值转为求北岸的最长上升子序列
//主要是发现这个性质,转为LIS问题。
typedef pair<int,int>PII;
PII q[N];
int f[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>q[i].first>>q[i].second;
}
sort(q+1,q+n+1);//对南岸的数值进行排序,即对q.first进行排序
int res=0;
for(int i=1;i<=n;i++)
{
f[i]=1;
for(int j=1;j<i;j++)
{
if(q[i].second>q[j].second) //如果q[i]对应的北岸坐标值大于q[j]相应北岸坐标值,则说明北岸也可单调上升,所以f[i]可由f[j]+1表示
{
f[i]=max(f[i],f[j]+1);
}
}
res=max(res,f[i]);
}
cout<<res<<endl;
return 0;
}
1016.最大上升子序列的和
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n;
//最大上升子序列的和
//主要是上升子序列和的最大值,主要是把f[i]=f[j]+1变成f[i]=f[j]+a[i];
int a[N];
int f[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int res=0;
for(int i=1;i<=n;i++)
{
f[i]=1;
for(int j=1;j<i;j++)
{
if(a[i]>a[j]) //如果q[i]对应的南岸坐标值大于q[j]相应南岸坐标值,则说明南岸也可单调上升,所以f[i]可由f[j]+1表示
{
f[i]=max(f[i],f[j]+a[i]);//因为求得是和的最大值,所以应该加值a[i];
}
}
res=max(res,f[i]);
}
cout<<res<<endl;
return 0;
}