为什么第一个我尝试用第一个题解的思路去做,将dp[1]初始化成1(我将木棍从数组下标1开始存的),因为无论如何从哪一个方面来说前1个最大上升子序列的长度一定是1.但是这样只能过四个点。而题解大佬将f[0]置为0最后输出加1就好,这是为什么。
#include<bits/stdc++.h>
using namespace std;
struct Edge{
int l,w;
};
Edge e[5001];
bool cmp(Edge x,Edge y){
if(x.l!=y.l){
return x.l>y.l;
}
return x.w>y.w;
}
int f[5001];
int dp[5001];
int main(){
int n,ans = 0;
cin>>n;
dp[1] = 1;
for(int i = 1;i <= n;i++){
cin>>e[i].l>>e[i].w;
}
sort(e+1,e+n+1,cmp);
for(int i = 1;i<=n;i++){
for(int j = 1;j< i;j++){
if(e[i].w>e[j].w){
dp[i] = max(dp[i],dp[j]+1);
}
}
if(dp[i]>ans){
ans = dp[i];
}
}
cout<<ans;
}