第四题上升点列参考程序代码:
#include<bits/stdc++.h>
using namespace std;
int n,k;
struct points {
int x,y;
} p[510];
bool cmp(const points a,const points b) {
if(a.x==b.x) return a.y<b.y;
else return a.x<b.x;
}
int f[510][110];//以i点为终点,再添加上j个点的情况下最大序列长度
int main() {
scanf("%d %d",&n,&k);
for(int i=1; i<=n; i++) {
scanf("%d %d",&p[i].x,&p[i].y);
}
sort(p+1,p+1+n,cmp);
int ans=0;
for(int i=1; i<=n; i++) {//以i为终点
for(int j=0; j<=k; j++) {//添加j个点
f[i][j]=j+1;//以i为终点,后续添加j个点最短的长度
for(int l=1; l<i; l++) { //l为i的前一个点
if(p[l].x<=p[i].x&&p[l].y<=p[i].y) {//横坐标、纵坐标值均单调不减
int t=p[i].x-p[l].x+p[i].y-p[l].y-1;//需要添加的点数量
if(j>=t) f[i][j]=max(f[i][j],f[l][j-t]+t+1);
cout<<p[i].x<<" "<<p[l].x<<" "<<p[i].y<<" "<<p[l].y<<" "<<t<<endl;
}
cout<<"i="<<i<<" j="<<j<<" l="<<l<<" f="<<f[i][j]<<endl;
}
ans=max(ans,f[i][j]);
}
}
printf("%d",ans);
return 0;
}
第四题上升点列文件提交参考程序代码:
#include<bits/stdc++.h>
using namespace std;
int n,k;
struct points
{
int x,y;
} p[510];
bool cmp(const points a,const points b)
{
if(a.x==b.x) return a.y<b.y;
else return a.x<b.x;
}
int f[510][110];//以i点为终点,再添加上j个点的情况下最大序列长度
int main()
{
//打开输入文件,输出文件
freopen("point.in","r",stdin);
freopen("point.out","w",stdout);
scanf("%d %d",&n,&k);
for(int i=1; i<=n; i++)
{
scanf("%d %d",&p[i].x,&p[i].y);
}
sort(p+1,p+1+n,cmp);
int ans=0;
for(int i=1; i<=n; i++)
{//以i为终点
for(int j=0; j<=k; j++)
{//添加j个点
f[i][j]=j+1;//以i为终点,后续添加j个点最短的长度
for(int l=1; l<i; l++)
{ //l为i的前一个点
if(p[l].x<=p[i].x&&p[l].y<=p[i].y)
{//横坐标、纵坐标值均单调不减
int t=p[i].x-p[l].x+p[i].y-p[l].y-1;//需要添加的点数量
if(j>=t) f[i][j]=max(f[i][j],f[l][j-t]+t+1);
//cout<<p[i].x<<p[l].x<<p[i].y<<p[l].y<<t<<endl;
}
//cout<<"i="<<i<<" j="<<j<<" l="<<l<<" f="<<f[i][j]<<endl;
}
ans=max(ans,f[i][j]);
}
}
printf("%d",ans);
//关闭输入文件输出文件
fclose(stdin);
fclose(stdout);
return 0;
}