zoukankan      html  css  js  c++  java
  • eduCF#61 C. Painting the Fence /// DP 选取k段能覆盖的格数

    题目大意:

    给定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
    ",dp[n]);
        }
    
        return 0;
    }
  • 相关阅读:
    Vim step by step
    Ubuntu解压命令全览
    这样才能使本地Mysql服务允许被外部主机连接(两步)
    [Python] logging.logger
    Python Selenium
    MySQL中char、varchar和text的区别
    Way to MongoDB
    Python误区之strip,lstrip,rstrip
    Android Studio Tips
    Way to tmux
  • 原文地址:https://www.cnblogs.com/zquzjx/p/10482924.html
Copyright © 2011-2022 走看看