赛时瞎搞代码求hack
查看原帖
赛时瞎搞代码求hack
458493
__BAI__楼主2022/10/30 14:53

自己都不相信过了。。。

#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
struct Point{
	int x,y;
}p[505];
bool cmp(Point a,Point b){
	return a.x<b.x||(a.x==b.x && a.y<b.y);
}
map<int,map<int,int> >m;
int dp[505][105];
int main(){
	cin>>n>>k;
	for(int i=0;i<n;i++)
		cin>>p[i].x>>p[i].y;
	sort(p,p+n,cmp);
	if(k==0){
		for(int i=n-1;i>=0;i--){
			int x=p[i].x,y=p[i].y;
			m[x][y]=max(m[x+1][y],m[x][y+1])+1;
			ans=max(ans,m[x][y]);
		}
		cout<<ans<<endl;
	}else{
		for(int i=n-1;i>=0;i--){
			int x=p[i].x,y=p[i].y;
			for(int j=i;j<n;j++){
				int x1=p[j].x,y1=p[j].y;
				if(x1>=x&&y1>=y){
					int k1=x1-x+y1-y-1;
					for(int l=0;l+k1<=k;l++){
						dp[i][l+k1]=max(dp[i][l+k1],dp[j][l]+k1+1);
						ans=max(ans,dp[i][l+k1]+k-l-k1);
					}
				}
			}
		}
		cout<<ans+1<<endl;
	}
	return 0;
}

思路:按x坐标进行排序,然后从后往前暴力dp,第一个表示第几个点,第二个表示目前已经添加了多少个点,但最后为什么是ans+1这里想不明白,同时个人无法证明该解法的正确性。

另外,x1和y1会不会CE

2022/10/30 14:53
加载中...