P11876 [威海市赛2024] 收徒!
P11876\(\mathbf{} \begin{Bmatrix} \frac{{\Large LUOGU-P11876} }{{\color{Red}\Large Solution} }\mathbf{} {No.14} \end{Bmatrix}\times{}\) NeeDna
题意分析,要从左上角到右下角,只能向右和向下,问最多能有多少收益。
因为动态规划要超空间,所以我们要用其他方法。对于每一行来说,只能从前往后,对于每一列,只能从上往下。所以可以把这个问题变成用贪心的最长不下降子序列。对行的大小排序之后的列数作为大小。最后记录一下每个数进入序列中的前一个数最后打印即可。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int h,w,n,num[N],tot,idd[N];
struct node{
int x,y,id,fr;
}a[N];
bool cmp(node a,node b){
if(a.y==b.y)return a.x<b.x;
return a.y<b.y;
}
void dfs(int x){
if(a[x].fr) dfs(a[x].fr);
node v=a[a[x].fr];
for(int i=v.x;i<a[x].x;i++) cout<<"R";
for(int i=v.y;i<a[x].y;i++) cout<<"D";
}
int main(){
cin>>h>>w>>n;
a[0].x=a[0].y=1;
for(int i=1;i<=n;i++){
cin>>a[i].y>>a[i].x;
}sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
a[i].id=i;
if(a[i].x>=num[tot]){
a[i].fr=idd[tot];
idd[++tot]=i;
num[tot]=a[i].x;
}
else{
int x=upper_bound(num+1,num+tot+1,a[i].x)-num;
idd[x]=i;
a[i].fr=idd[x-1];num[x]=a[i].x;
}
}
cout<<tot<<'\n';
a[n+1]={w,h,0,idd[tot]};
dfs(n+1);
return 0;
}

浙公网安备 33010602011771号