问题描述

现在我认为你已经在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;}}

杭电1024 Max Sum Plus Plus状压dp(java)相关推荐

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

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

  2. HDU 1024 Max Sum Plus Plus

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java ...

  3. HDUOJ 1024 Max Sum Plus Plus

    HDUOJ 1024 Max Sum Plus Plus 题目链接 Problem Description Now I think you have got an AC in Ignatius.L's ...

  4. Gym - 101853E E. Maximum Sum (状压DP)

    原题地址:https://codeforces.com/gym/101853/problem/E 题意:给出一个n*n的矩阵,矩阵中每一个格子都有一个权值,选择一个格子就能拿到当前的权值,但是同时就不 ...

  5. CF1463F Max Correct Set(取小样法+状压 DP)

    CF1463F Max Correct Set 要求选出集合 \(U=\{1,2,3,\dots,n\}\) 的一个子集 \(S\),满足:如果 \(a \in S\) 并且 \(b \in S\), ...

  6. hdu 4739 状压DP

    这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...

  7. POJ - 1185 炮兵阵地(状压dp)

    题目链接:点击查看 题目大意:中文题,题意很清晰,不多赘述 题目分析:最基础的状压dp,需要考虑如何转移,因为每一个炸弹所涉及的范围都是上下左右两个格子,我们可以从第一行开始向下转移,这样某一行的状态 ...

  8. 【PKUWC2018】随机算法【状压dp】【组合计数】

    题意:一张nnn个点mmm条边的无向无权图,求以下算法计算最大独立集的正确率:随机一个排列,依次考虑排列中每一个点,如果不与任何一个独立集中的点相邻则将其加入独立集.模9982443539982443 ...

  9. 【状压DP】滚榜(P7519)

    正题 P7519 题目大意 n个队伍,排名先按分数排序再按编号排序,每个队伍有一个初始分数 aia_iai​,和一个附加分数 bib_ibi​ 对于一个合法的 bib_ibi​ 序列,按 bib_ib ...

最新文章

  1. Linux开发中 MD5值的计算
  2. tableau地图城市数据_优阅达“优分享” | Tableau 2020.4 “地图标记层” 的多种妙用...
  3. python selenium 等待页面加载_python selenium 三种等待方式详解(实战常用)
  4. yelee主题安装gitalk(转载+整理)
  5. 那些年我们踩过的乱码坑
  6. Objects as Points 论文总结
  7. 【BZOJ2164】采矿 树链剖分+线段树维护DP
  8. 游戏ai人工智能_AI与游戏,第1部分:游戏如何推动了两门AI研究流派
  9. JAVA的三大框架是什么?
  10. python装在c盘、怎么换到d盘_怎么把安装在c盘的东西移到d盘_如何把c盘的应用程序移到d盘...
  11. B站粉丝计数软件(python开发)
  12. android来电自定义显示图片,安卓手机如何自定义设置通话背景
  13. 桌面端如何运行小程序?
  14. FirmAE安装指北
  15. XP下架设奇迹教程+全套服务套+登陆器+架设PL网站教程
  16. 计算机二级access上机,计算机二级Access上机考点
  17. Java之-MyBatis
  18. 5.1 数据去重 完全去重
  19. TatukGIS Developer Kernel ToolkitWinform GIS编辑器,C#地理信息编辑器,.NET地理信息编辑器...
  20. java mysql判断字符串相等_【Java】利用String的compareTo比较两个时期字符串

热门文章

  1. 为什么说一次一密加是密抗窃听无条件安全的?
  2. VMProtect SDK+ASProtect SDK保护
  3. 暴力关闭Windows defender
  4. frp端口映射服务器搭建
  5. MoeCTF 2021Re部分------ez(递归转循环)
  6. 存储管理算法java代码
  7. 【网络安全】一个堆题inndy_notepad的练习笔记
  8. 【grafana】API 遇到的问题
  9. 分别用顺序表和链表实现队列
  10. 1142 Maximal Clique (25 分)【难度: 一般 / 知识点: 模拟】