Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
52467 | wsad | 木板游戏 | C++ | 解答错误 | 0 | 2000 MS | 4784 KB | 884 | 2022-07-19 12:15:55 |
#include <bits/stdc++.h> using namespace std; const int N=5e5+3; int dp[2][N]; //dp[i][j]->前i个(滚动)以j结尾的木板数,dp[i][0]->最大木板数 struct stu { int l,r; } w[N]; int Read() { int sum=0; char ch=getchar(); while(ch<'0' || ch>'9') ch=getchar(); while(ch>='0' && ch<='9') sum=sum*10+ch-'0',ch=getchar(); return sum; } bool cmp(stu a,stu b) { return a.l==b.l ? a.r>b.r : a.l<b.l; } int main() { int n; n=Read(); for(int i=1; i<=n; ++i) w[i].l=Read(),w[i].r=Read(); sort(w+1,w+1+n,cmp); for(int i=1,k=1; i<=n; ++i,k=!k) //k -> i,!k -> i-1 { dp[k][0]=dp[!k][0]; for(int j=1; j<=i; ++j) { if(w[i].l>=w[j].l && w[i].r<=w[j].r) dp[k][j]=max(dp[k][j],dp[!k][j]+1); dp[k][0]=max(dp[k][0],dp[k][j]); } } cout<<dp[n&1][0]<<'\n'; return 0; }