eduCF#61 C. Painting the Fence /// DP 选取k段能覆盖的格数

本文介绍了一种解决区间覆盖问题的动态规划算法。通过给定的区间范围,算法旨在找到最多能覆盖的格子数,当选择m-2个区间进行覆盖时。详细解释了算法流程,包括初始化、区间更新及DP状态转移方程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:

给定n m

接下来给定m个在n范围内的段的左右端 l r

求选取m-2段 最多能覆盖多少格

 

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mem(i,j) memset(i,j,sizeof(i))
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int N=5e3+5;

int n, m, L[N], dp[N];
// L[i] 表示 所有画到i的段中 l最左的一段的左端
// dp[i] 表示到i为止 选出当前k段 的最优解

int main()
{
    while(~scanf("%d%d",&n,&m)) {
        inc(i,1,n) L[i]=i+1, dp[i]=0;
        // L[]置为i+1是为了表示没有被画过的状态
        inc(i,1,m) {
            int l,r; scanf("%d%d",&l,&r);
            inc(j,l,r) L[j]=min(L[j],l);
        }
        inc(k,1,m-2) {
            dec(i,n,1) dp[i]=max(dp[L[i]-1]+i-L[i]+1,dp[i]);
            // L[i]~i的一段都被画了 长度为 i-L[i]+1
            // 所以 dp[L[i]-1] 加上 L[i]到i被画的一段 更新dp[i]
            inc(i,1,n) dp[i]=max(dp[i],dp[i-1]);
            // 短的段存在更优的方案 自然可以更新长的段
        }
        printf("%d\n",dp[n]);
    }

    return 0;
}

 

转载于:https://www.cnblogs.com/zquzjx/p/10482924.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值