Solution
2026-07-19 19:35:55
发布于:广东
34阅读
0回复
0点赞
[CSP-J 2022] 上升点列
题意
只能向右、向上走,坐标单调不减;最多额外加 个点,求最长点序列。
两点 到 需要插入点数:
DP
- 所有点按 升、 升排序
- 状态: 以第 个点结尾,用了 个新增点的最大长度
- 初始化:
- 转移: 且 ,花费 个新增点
- 答案:遍历所有 取最大值
Solution
#include<bits/stdc++.h>
using namespace std;
struct P{int x,y;}p[505];
int n,k,dp[505][105],ans;
bool cmp(P a,P b){return a.x==b.x?a.y<b.y:a.x<b.x;}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>p[i].x>>p[i].y,dp[i][0]=1;
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++){
if(p[j].y>p[i].y)continue;
int d=p[i].x-p[j].x+p[i].y-p[j].y-1;
for(int t=d;t<=k;t++)
dp[i][t]=max(dp[i][t],dp[j][t-d]+d+1);
}
for(int i=1;i<=n;i++)
for(int t=0;t<=k;t++)
ans=max(ans,dp[i][t]+k-t);
cout<<ans;
return 0;
}
这里空空如也





有帮助,赞一个