首页 > 其他分享 >kuangbin题单|基础dp

kuangbin题单|基础dp

时间:2023-01-06 14:22:22浏览次数:57  
标签:last 子段 int maxn kuangbin include dp 题单

1.HDU1024 Max Sum Plus Plus 最大M子段和

\(dp[i][j]\)表示以第j个数结尾且被分为i段的最大子段和,答案即是\(dp[m][n]\)。

与单集合(\(m=1\))的最大字段和不同的点在于,本题需要组成\(m\)个不相交的最大子段,因而对状态转移方程进行修改:

  • 第一种情况:第\(j\)个数纳入前\(j-1\)个数的最右最大子段中,即\(dp[i][j]=dp[i][j-1]+a[j]\)

  • 第二种情况:第\(j\)个数不被纳入最右侧的最大子段,作为第i个子段存在,即\(dp[i][j]=dp[i-1][k]+a[j],k<j\)。

综上:

\[dp[i][j]=max(dp[i][j-1]+a[j],dp[i-1][k]+a[j]) \]

注意到范围\(n\leq 1e6,m\)虽然很小不会卡成\(O(n^2)\),但依然会\(MLE\),故考虑滚动数组优化:

\[dp[j]=max(dp[j-1]+a[j],last[j-1]+a[j]) \]

其中\(last[j]\)表示前j个\(dp[j]\)的最大值,通过滚动数组维护并更新。

复杂度\(O(mn-m^2/2)\)

#include<cstdio>
#include<iostream>
#include<cstring>

const int maxn = 1e6 + 10;
const int inf = 0x3f3f3f3f;
int n, m, a[maxn];
int f[maxn], last[maxn];
int tmp = -inf;

void dp() {
    for (int i = 1; i <= m; i++) {
        tmp = -inf;
        for (int j = i; j <= n; j++) {//j<i是无法分出i组子段的
            f[j] = std::max(f[j - 1] + a[j], last[j - 1] + a[j]);
            last[j - 1] = tmp;
            tmp = std::max(tmp, f[j]);
        }
    }
}

int main() {
    while (scanf("%d%d", &m, &n) == 2) {
        for (int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        memset(f, 0, sizeof(f));
        memset(last, 0, sizeof(last));
        dp();
        printf("%d\n", tmp);
    }
}

2.Ignatius and the Princess IV 计数?

\(map\)存一下出现次数就行,用不着\(dp\)

#include<iostream>
#include<cstdio>
#include<map>

std::map<int, int> m;
int n, x, ans;

int main() {
    while (scanf("%d", &n) == 1) {
        m.clear();
        for (int i = 1; i <= n; i++) {
            scanf("%d", &x);
            m[x]++;
            if (m[x] >= (n + 1) / 2) {
                ans = x;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

标签:last,子段,int,maxn,kuangbin,include,dp,题单
From: https://www.cnblogs.com/MrWangnacl/p/17030356.html

相关文章

  • 『中级篇』Docker-Stack部署wordpress(49)
    前面几次对service讲述很多了,创建,启动,停止,删除,service对外的访问的方式,这次用了会继续docker-swarm的services,但是这次用比较一种简单方便的方式来完成,之前说过docker-compo......
  • 『中级篇』docker的魅力初体验-5分钟安装wordpress不走弯路(三)
    安装截图说话官网安装教程:​​wordpress中文安装教程​​咱们也用docker在一个新的centos虚拟机装一把。光吹说多好没用。开始展示真实的实力的时候了,用我的教程保证5分钟......
  • 『中级篇』docker之wordpress容器SSL(番外篇)(78)
    ache2容器内安装SSL实现wordpress证书安装。前提​​『中级篇』docker容器安装wordpress(37)​​通过上边的方式已经安装了wordpress和mysql,可以正常的访问准备工作进入容......
  • 『中级篇』在docker-swarm集群里通过serivce部署wordpress(46)
    开始部署之前讲过Overlay网络,不在同一台机器也可以完成正常的通信。这里就通过overlay网络的方式。创建overlay的网络dockernetworkcreate-doverlaydemo创建mysql#等待......
  • 单调队列优化的DP问题
    单调队列优化的DP问题概述单调队列就是通过排除求最值时候的冗余,从而是队列具有性质,可以方便求解问题。DP的两个阶段:朴素DP的基本原理——闫氏DP分析法对朴素DP进行......
  • SSDP反射放大攻击理论原理
    什么是SSDPDDoS攻击?简单服务发现协议(SSDP)攻击是一种基于反射的分布式拒绝服务(DDoS)攻击,它利用通用即插即用(UPnP)网络协议将放大的流量发送给目标受害者,使目......
  • 【新生寒训】day 10 状压dp2
    【新生寒训】day10状压dp2果咩纳塞米娜桑!!!!我选的太难了......
  • Android屏幕适配小技巧swdp
    最近做一个项目需要适配到不同的平板和手持设备上,在屏幕适配上遇到了一些问题,查了Android官方文档了解了一些技巧的,现在总结如下:先解释几个概念:1、dpi(dotperinch),即每英......
  • LNMP架构环境之PHP+Mariadb环境项目:部署博客wordpress项目
    1)配置nginx博客虚拟主机cat>/etc/nginx/conf.d/02_blog.etiantian.org.conf<server{server_nameblog.etiantian.org;listen80;root/data/blog;indexindex.php......
  • 树形 dp 与树上问题
    NFLS集训笔记20220802-树形dp进阶与树上问题综合\(\text{ByDaiRuiChen007}\)I.洛谷[P2585]-三色二叉树\(\text{Link}\)思路分析简单题,建出树后暴力枚举当前......