当前位置: 首页 > news >正文

java max sum_杭电1024 Max Sum Plus Plus状压dp(java)

问题描述

现在我认为你已经在Ignatius.L的“最大总和”问题中得到了AC。为了成为一名勇敢的ACMer,我们总是向更难挑战的问题挑战自我。现在你面临着一个更困难的问题。

给定连续的数字序列S1,S2,S3,S4 … Sx,… Sn(1≤x≤n≤1,000,000,-32768≤Sx≤32767)。我们定义了函数和(i,j)= Si … Sj(1≤i≤j≤n)。

现在给定一个整数m(m> 0),你的任务是找到m对i和j,它们使sum(i1,j1) sum(i2,j2) sum(i3,j3) … sum (im,jm)maximal(ix≤iy≤jx或者ix≤jy≤jx是不允许的)。

但我很懒惰,我不想写一个专门的判断器模块,所以你不必输出m对i和j,只输出sum(ix,jx)的最大和(1≤x ≤m)。 ^ _ ^

输入

每个测试用例将以两个整数m和n开始,随后是n个整数S1,S2,S3 … Sn。

处理到文件的结尾。

产量

在一行中输出上述最大和。

示例输入

1 3 1 2 3

2 6 -1 4 -2 3 -2 3

示例输出

6

8

这题刚开始不明白,后来看了别人的思路。用dp[m][n]自己做出来但是数组太大,后来又继续学习,发现人家把多维的压缩成二维,看了好久才看明白。。

首先 value[i][j]表示以第j个元素结尾的i对最大,(dp经常处理的是以谁为结尾)

dp[i][j]表示第j元素中要求的最大。

i>j时:

value[i][j] = max( value[i][j-1] a[j], max( value[i-1][t] (i-1<=t <= j-1) a[j]))可以理解。

简单而说value[i][j] = max(i对以第j-1结尾 a[j],i-1对前j-1个找最大 a[j]);(直接接上,和最后一个单独取)

那么 value[i][j]=max(value[i][j-1] a[j],dp[i-1][j-1] a[j]);

然而 dp[i][j]=max(以第j个结尾的最大,不以第j个结尾)。

可以表示为:dp[i][j]=max(value[i][j],dp[i][j-1])

最终得到方程组:

value[i][j]=max(value[i][j-1] a[j],dp[i-1][j-1] a[j]);

dp[i][j]=max(value[i][j],dp[i][j-1]) ;

dp[i][j]只和当前的 dp[i][]和 value[i][]有关,和前面的数据无关,而value[i][]只和value[i][]和dp[i-1][]有关,可以想一下,每一次i循环,我求这组的数据value要重新赋值,并且和dp[i][]层,和dp[i-1][]层有关,那么我就可以直接用value[j]表示当前i层的以j为结尾的最大。同理第i层的dp求要用到前面的dp[i][]和上一层的dp[i-1][];那么可以简写为 dp[i%2][j]表示当前i的以j之中的最大。

简写为:

value[j]=max(value[j-1] a[j],dp[(i-1)%][j-1] a[j]);

dp[i%2][j]=max(value[j],dp[i%2][j-1]) ;

打个比方:爸爸妈妈儿子女儿洗澡,一个人要一个桶泡,你有钱可以买四个桶一人一个洗澡,你没钱就爸爸先用,然后妈妈,女儿,儿子用。

附上代码如下:

import java.util.Scanner;

public class 杭电1024 {

public static void main(String[] args) { Scanner sc=new Scanner(System.in); while(sc.hasNext()) { int m=sc.nextInt();//对数 int n=sc.nextInt();//元素个数 int a[]=new int[n 1];//元素值 int dp[][]=new int[2][n 1]; int value[]=new int[n 1]; int q=0;int max=0; for(int i=1;ii) { value[j]=max(dp[(i-1)%2][j-1] a[j],value[j-1] a[j]);// dp[i%2][j]=max(dp[i%2][j-1],value[j]);// } } } System.out.println(dp[m%2][n]); }

}

private static int max(int i, int value) { return i>value?i:value;

}

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

文章来源: bigsai.blog.csdn.net,作者:Big sai,版权归原作者所有,如需转载,请联系作者。

原文链接:bigsai.blog.csdn.net/article/details/79628860


http://www.taodudu.cc/news/show-647747.html

相关文章:

  • 【physx/wasm】在physx中添加自定义接口并重新编译wasm
  • excel---常用操作
  • Lora训练Windows[笔记]
  • linux基础指令讲解(ls、pwd、cd、touch、mkdir)
  • InnoDB 事务处理机制
  • 启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS
  • java主线程控制子线程_CountDownLatch控制主线程等子线程执行完--Java多线程
  • mysql数据库事件不执行_如何查看mysql事件是否执行
  • 我的世界1.7.10java下载安装_我的世界1.7.10正式版
  • java编写单词数_JAVA flink小试——单词计数
  • bbs mysql_简单BBS程序(需MySQL支持)
  • java oom分析_OOM分析
  • anaconda怎么使用python包_Anaconda中python包的介绍与使用方法
  • php抓取运动步数,使用PHP抓取微博数据
  • php 网页截屏,怎么用PHP实现网页截图
  • thread php,php中关于线程thread的使用
  • cmf php,cmf公共函数解析-common.php
  • php 实现时时更新地图,PHP实现隔15分钟自动更新网站地图功能
  • php中显示不出图像,php – 无法显示图像,因为它包含错误
  • java后台日期怎么去重,JAVA后台业务实现去重
  • php stripos 返回值,php函数stripos详解
  • java中gc的认识,java JVM GC 笔记(个人对GC 或JVM 的了解)
  • java libpcap,Linux下编译安装libpcap
  • 网页实现人脸识别PHP,奇思妙想-用HTML5进行人脸识别
  • 文件包含漏洞不能包含php,ThinkPHP5漏洞分析之文件包含
  • php对应哪个oracle版本,Oracle 版本说明
  • php 主页子标题修改,关于有部分用户默认PC主页大标题标签修改无效的答疑.
  • 基于matlab的智能天线波束方向图仿真,基于MATLAB的智能天线波束方向图仿真
  • python中xlwt的局限,Python xlwt 生成Excel和设置特定单元格不可编辑
  • angularjs 导出excel php,AngularJS 导出Excel指令
  • php 连续点击事件,javascript设置连续两次点击按钮时间间隔的方法_javascript技巧...
  • oracle10g数据库热备份,Oracle10g数据库冷备份脚本文件
  • Oracle创建序列的sql语句,【Oracle学习】之 序列(Sequence)
  • cssd拉起oracle,oracle rac /etc/init.d/init.cssd startcheck
  • oracle dg状态查询,oracle dg状态检查及相关命令
  • keep alive PHP,vue中keep-alive使用方法详解