AcWing 4378. 选取数对
y总分析:这种题(我也不知道说的是哪种题hh)一般解法为贪心或dp,而本题用的是dp。
其实个人感觉题目不是很严谨,从y总讲解和题解分析得知各个数对区间是不能重叠的,但是题目使用的是≤,感觉数对的区间边界点是可以重复的。
方法1:y总的讲解,个人感觉比较难理解,也没有完全理解,因此只贴一个链接:第一届ACC(AcWing Cup)全国高校联赛_哔哩哔哩_bilibili
方法二:AcWing 4378. 选取数对(闫式dp分析法,但是要比y总讲的简单) - AcWing
思路:
闫式dp分析法
状态表示f[i][j]:表示在前i个数中选,j个区间的所有集合,属性:max
状态计算f[i][j]:根据最后一个区间是否包含最后一个点i来进行集合划分
1.不包含:f[i][j]=max(f[i][j],f[i-1][j])
2.包含:f[i][j]=max(f[i][j],f[i-m][j-1]+sum[i]-sum[i-m]) //如果包含i的话最后一个区间的右端点就是i
Java代码实现:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
*
*/
public class Main {
static int N=5000+5;
//下标从1开始
//f[i][j]的意思是从前i个数中选择k个数对
static long[][] f=new long[N][N];
static long[] sum=new long[N];
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] line = reader.readLine().split(" ");
int n=Integer.parseInt(line[0]);
int m=Integer.parseInt(line[1]);
int k=Integer.parseInt(line[2]);
line=reader.readLine().split(" ");
//录入数据并计算前缀和
for (int i = 0; i < n; i++) {
sum[i+1]=Long.parseLong (line[i]);
sum[i+1]+=sum[i];
}
for (int i = 1 ; i <= n; i++) {
for (int j = 1; j <= k; j++) {
//不选择第i个数
f[i][j]=f[i-1][j];
//如果选择第i个数作为末尾
//不选择第i个数是无条件的,但是选择第i个数作为末尾必须保证:此数对可以选择,即此数对第一个数下标必须≥1
if (i-m+1>=1) {
f[i][j]=Math.max(f[i][j], f[i-m][j]+sum[i]-sum[i-m]);
}
}
}
System.out.println(f[n][k]);
}
}
方法三:https://www.acwing.com/solution/content/72485/
思路
和方法二本质上是相同的,只是进行了预处理,直接将原数组转换成了最终的一个一个数对的和值数组,然后也是最后一个数块的选择与否来进行集合的划分。
c++代码实现:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5010;
ll n,m,k;
ll a[N],b[N];
ll w[N];
ll f[N][N];
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=b[i-1]+a[i];
}
ll cnt=0;
for(int i=1;i+m-1<=n;i++)
{
//先将每个数对的之间的和单独做成一个数组,w即为此数组
w[++cnt]=b[i+m-1]-b[i-1];//预处理区间
}
for(int i=1;i<=cnt;i++)
{
for(int j=1;j<=k;j++)
{
//i-m<0 因为数块下标从0开始,表示此数块如果选择的了的话就不能选择其他块了(取w[i])
//f[i][j]=max(不选此块,选此块);
if(i-m<0) f[i][j]=max(f[i-1][j],w[i]);//此时最多选择一个区间
//如果此数块可以选择,那么就在选择该块和不选之间取最大值。
//即f[i][j]=max(不选此块,选此块);
else f[i][j]=max(f[i-1][j],f[i-m][j-1]+w[i]);
}
}
cout<<f[cnt][k];
return 0;
}
AcWing 4378. 选取数对的更多相关文章
- acwing 853. 有边数限制的最短路 模板
地址 https://www.acwing.com/problem/content/description/855/ 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 ...
- AcWing 853. 有边数限制的最短路 bellman-ford 结构体
//存在负权值 处理负环 //如果能求出来 一般是不存在负权回路 //如果有负回路 那最小距离可能是负无穷 #include <cstring> #include <iostream ...
- NFS服务器简介
1.NFS为Network File System(网络文件系统):不同机器不同的操作系统可以彼此共享数据文件. NFS的配置简单,启动remote procedure call(RPC, ...
- Codeforces Round #195 A B C 三题合集 (Div. 2)
A 题 Vasily the Bear and Triangle 题目大意 一个等腰直角三角形 ABC,角 ACB 是直角,AC=BC,点 C 在原点,让确定 A 和 B 的坐标,使得三角形包含一个矩 ...
- Machine Learning in Action -- Logistic regression
这个系列,重点关注如何实现,至于算法基础,参考Andrew的公开课 相较于线性回归,logistic回归更适合用于分类 因为他使用Sigmoid函数,因为分类的取值是0,1 对于分类,最完美和自然的函 ...
- HDU 5396 Expression(DP+组合数)(详解)
题目大意: 给你一个n然后是n个数. 然后是n-1个操作符,操作符是插入在两个数字之间的. 由于你不同的运算顺序,会产生不同的结果. 比如: 1 + 1 * 2 有两种 (1+1)*2 或者 ...
- Ubuntu环境下NFS服务器搭建
看到鸟哥私房菜对NFS的介绍,就想试试玩一下.看起来步骤也很简单. 1.背景名词. NFS(Network File System) 作用:让所有的Unix-like 机器通过网络共享彼此的文件 局限 ...
- BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS
BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS Description Diffie-Hellman密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码 ...
- 题解-HAOI2018全套
去冬令营转了一圈发现自己比别人差根源在于刷题少,见过的套路少(>ω<) 于是闲来无事把历年省选题做了一些 链接放的都是洛谷的,bz偷懒放的也是链接 AM.T1 奇怪的背包 Problem ...
随机推荐
- Android Studio配置openvc
最近项目中需要用到opencv,于是就研究了一下怎么在Android studio中配置opencv,记录一下,免得以后还会使用. 一.因为本人Android Studio是4.1的,网上资料大多是3 ...
- Visual Studio 2022 git error Unable to negotiate with xx.xxx.xxxx port 22: no matching host key type found. Their offer: ssh-rsa
前言 前两天因为升级了Git导致git提交拉取的时候都提示下面这个异常,然后经过一番折腾以后终于把这个问题解决了.但是今天我升级了下Visual Studio 2022将其升级到了17.1.3版本然后 ...
- 讲解CPU之NUMA硬件体系以及机制(lscpu查看相关信息)
先看看从系统层面反映出来的numa cpu信息.采样机器为实体机.80核.128内存. [root@ht2 src]# lscpu Architecture: x86_64 #x86架构下的64位 C ...
- 时间篇之centos6下修复的ntp操作(ntpd和ntpdate两个服务区别)
系统采样,本采样和命令都是在centos6.4的系统中进行 主要比较centos7和centos6之间的差异,因为大部分都开始采用centos7但是有些老系统还采用centos6,这样我们就需要熟悉c ...
- Java基础语法02——流程控制
流程控制:顺序结构.分支结构(if-else.switch-case).循环结构(for.while.do-while)
- MassTransit 入门(一)
本文地址源码 MassTransit是一个面向.net的免费开源分布式应用程序框架. MassTransit使得创建应用程序和服务变得很容易,这些应用程序和服务利用基于消息的.松散耦合的异步通信来获得 ...
- Typora+PicGO+Gitee实现图床功能
Typora+PicGO+Gitee实现图床功能 版本 typora(0.9.86) PicGo(2.3.0) 主要参考链接 出现问题就先看看这个 问题一 打开PicGo后安装github插件会一直安 ...
- Google kickstart 2022 Round A题解
Speed Typing 题意概述 给出两个字符串I和P,问能否通过删除P中若干个字符得到I?如果能的话,需要删除字符的个数是多少? 数据规模 \[1≤|I|,|P|≤10^5 \] 双指针 设置两个 ...
- python基础练习题(题目 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数)
day12 --------------------------------------------------------------- 实例019:完数 题目 一个数如果恰好等于它的因子之和,这个 ...
- Find the Maximum - 题解【思维,贪心】
题面 这是2022年ICPC昆明站的F题.在赛场上,我一开始敲了个贪心,但是出锅了,改敲树形DP,但是时间来不及了.在队友的提醒下补过了这个题,知道解法的我发现我就是个纯纯的老坛-- 原题链接在牛客网 ...