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. 选取数对的更多相关文章

  1. acwing 853. 有边数限制的最短路 模板

    地址 https://www.acwing.com/problem/content/description/855/ 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 ...

  2. AcWing 853. 有边数限制的最短路 bellman-ford 结构体

    //存在负权值 处理负环 //如果能求出来 一般是不存在负权回路 //如果有负回路 那最小距离可能是负无穷 #include <cstring> #include <iostream ...

  3. NFS服务器简介

    1.NFS为Network File System(网络文件系统):不同机器不同的操作系统可以彼此共享数据文件.      NFS的配置简单,启动remote procedure call(RPC, ...

  4. Codeforces Round #195 A B C 三题合集 (Div. 2)

    A 题 Vasily the Bear and Triangle 题目大意 一个等腰直角三角形 ABC,角 ACB 是直角,AC=BC,点 C 在原点,让确定 A 和 B 的坐标,使得三角形包含一个矩 ...

  5. Machine Learning in Action -- Logistic regression

    这个系列,重点关注如何实现,至于算法基础,参考Andrew的公开课 相较于线性回归,logistic回归更适合用于分类 因为他使用Sigmoid函数,因为分类的取值是0,1 对于分类,最完美和自然的函 ...

  6. HDU 5396 Expression(DP+组合数)(详解)

    题目大意: 给你一个n然后是n个数. 然后是n-1个操作符,操作符是插入在两个数字之间的. 由于你不同的运算顺序,会产生不同的结果. 比如: 1 + 1 * 2 有两种  (1+1)*2   或者   ...

  7. Ubuntu环境下NFS服务器搭建

    看到鸟哥私房菜对NFS的介绍,就想试试玩一下.看起来步骤也很简单. 1.背景名词. NFS(Network File System) 作用:让所有的Unix-like 机器通过网络共享彼此的文件 局限 ...

  8. BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS

    BZOJ_5296_[Cqoi2018]破解D-H协议_BSGS Description Diffie-Hellman密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码 ...

  9. 题解-HAOI2018全套

    去冬令营转了一圈发现自己比别人差根源在于刷题少,见过的套路少(>ω<) 于是闲来无事把历年省选题做了一些 链接放的都是洛谷的,bz偷懒放的也是链接 AM.T1 奇怪的背包 Problem ...

随机推荐

  1. Hive启动报错:java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument

    报错详细: Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preco ...

  2. java中求一下2008年5月31日, 往前倒30天是哪天?

    题目9: 2008年5月31日, 往前倒30天是哪天?  import java.util.*; public class Test {     public static void main(Str ...

  3. 如何在jsp界面进行判断再输出不同的值

    C标签的out <td> <c:if test="${nowtime eq returntime}"> <c:out value="逾期&q ...

  4. IO流的简单实现

    IO流的几种实现方式 学习目标: 例题: 字节输出流 字节输入流 字符输入流 字符输出流 学习目标: 熟练掌握IO流的基本实现方式 例题: 字节输出流 代码如下: public class Outpu ...

  5. EMS修改邮箱容量限制的方法

    使用PowerShell命令完成邮箱数据库限制任务. 以Exchange管理员身份打开EMS控制台.在PowerShell命令提示符下,键入如下命令. Set-MailboxDatabase Test ...

  6. rem,px,em最大的区别;

    px:px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的.移动端的分辨率很多.所以px不适用移动端em:em的值不固定:其长度继承父级元素的字体大小rem:相对于根元素htm ...

  7. Golang | 测试与性能调优

    Test 我们在日常的工作过程中,自测是不可缺少的,公司还会要求所有的公共方法必须要写单测,在别的语言中,我们如果想要写单测还需要使用到测试框架,但是Go语言中,直接支持测试,并且使用起来非常简单. ...

  8. BUCK电路和BL8033使用记录

    我开始时用的是MPS的MP1584EN,这个芯片各方面都挺不错的.有次老大让我画个降压电路,看到用的是MP1584就说国外的芯片太贵,让我用上海贝岭的BL8033.BL8033确实很好用,虽然它没有1 ...

  9. SwitchHosts管理编辑hosts工具

    管理Hosts工具 SwitchHosts 地址: SwitchHosts 开发工程中,针对不同项目设置不同的域名. 办法很多,例如直接编辑hosts文件,通过环境工具提供的功能设置等. 现在要安利一 ...

  10. 原生 js 重点案例 [tab栏切换]

    代码示例 :  <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...