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;
} 
posted @ 2025-05-30 20:58  NeeDna  阅读(11)  评论(0)    收藏  举报