首页 > 其他 > 详细

dp(0)

时间:2019-03-18 22:29:45      阅读:192      评论:0      收藏:0      [点我收藏+]

比赛前来一发

近期写的几个入门dp都不会的转移方程

p1280

在1~N的区间中有若干个任务,求出最大的空闲时间

反向递推 dp[i]为当前时间点的最大空闲时间

如果当前时间的任务数为0
\[dp[i] = dp[i+1] + 1\]
如果当前时间的任务数大于零
\[dp[i] = max(dp[i],dp[i+end[j]])\]
j取值为当前时间开始的所有任务

P1020 导弹拦截

第一问求最长不下降子序列,第二问求最长不上升子序列(后面不上升序列可以用当前系统拦截?上升了则需要新的系统)

dp[i]是长度为i的不下降子序列的最大结束点

如果当前a[i]<=dp[cur]

    dp[++cur] = a[i];

长度加1 结束点为a[i]

如果当前a[i]>dp[cur]

int l=0,r=cur;
int mid
{
    while(l<r)
    {
        mid = (l+r)>>1;
        if(dp[mid]>=a[i])   
            l = mid +1;
        else
            r = mid;
    }
    dp[l] = a[i];
}

二分长度(dp的值满足单调性) 更新dp值为a[i]

p1091

要求序列满足 $T_1<T_2\dotsT_i+1\dots>T_k $
求序列的最大长度

我们可以计算从左到右每个点的最长上升序列和从右到左每点的下降序列

对每个点的上升序列加下降序列最大减1即为答案

for(int i=1;i<=n;++i)
{
    for(int j=1;j<i;++j)
    {
        if(a[i]>a[j])
            dp[i] = max(dp[i],dp[j]+1;
    }
}

dp(0)

原文:https://www.cnblogs.com/xxrlz/p/10555619.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!