比赛 |
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;
}