比赛 CSP2022普及组 评测结果 AAAATAATTAAAAAAEEEEE
题目名称 上升点列 最终得分 60
用户昵称 00000 运行时间 4.040 s
代码语言 C++ 内存使用 16.39 MiB
提交时间 2022-10-29 16:48:43
显示代码纯文本
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,k;
int g[200][200];
int f[200][200][200],ans;//x,y,加点数 
struct node{
	int x,y;
}a[1000],b[1000];
int d[1000],e[1000];//对应关系 
bool cmp1(node c,node d)
{
	if(c.x!=d.x)
	return c.x<d.x;
	else return c.y<d.y;//y相近 
}
bool cmp2(node c,node d)
{
	if(c.y!=d.y)
	return c.y<d.y;
	else return c.x<d.x;
}
void wn(int p,int ps)
{
	ans=max(ans,ps);
	if(a[p+1].y==a[p].y+1) wn(p+1,ps+1);
	if(b[d[p]+1].x==b[d[p]].x+1) wn(e[d[p]+1],ps+1);
}
void work(void)
{
	for(int q=1;q<=n;q++)
	{
		int l,r;
		cin>>l>>r;
	 	a[q].x=b[q].x=l,a[q].y=b[q].y=r;
	}
	sort(a+1,a+n+1,cmp1);
	sort(b+1,b+n+1,cmp2);
	for(int q=1;q<=n;q++)
	{
		for(int w=1;w<=n;w++)
		{
			if(a[q].x==b[w].x&&a[q].y==b[w].y) d[q]=w,e[w]=q;
		}
	}
	for(int q=1;q<=n;q++)
	{
		wn(q,1);
	}
	cout<<ans;
}
int main(){
	freopen("csp2022pj_point.in","r",stdin);
	freopen("csp2022pj_point.out","w",stdout);
cin>>n>>k;
if(k==0)
{
	work();
	return 0;
}
for(int q=1;q<=n;q++)
{
	int x,y;
	cin>>x>>y;
 	g[x][y]++;
}
for(int x=1;x<=100;x++)
{
	for(int y=1;y<=100;y++)
	{
		f[x][y][0]=g[x][y];
		if(g[x][y]) f[x][y][0]+=max(f[x-1][y][0],f[x][y-1][0]);
		for(int q=1;q<=k;q++)
		{
			if(g[x][y]) f[x][y][q]=max(f[x-1][y][q],f[x][y-1][q])+1;
			else f[x][y][q]=max(f[x-1][y][q-1],f[x][y-1][q-1])+1;
		}
		ans=max(ans,f[x][y][k]);
//		cout<<f[x][y][k]<<" ";
	}
//	cout<<endl;
}
//for(int q=1;q<=100;q++)
//{
//	for(int w=1;w<=100;w++)
//	{
//		cout<<g[q][w]<<" ";
//	}
//	cout<<endl;
//}
cout<<ans;
return 0;
}