hdu1024】的更多相关文章

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1024 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1053 [题解] 原来的解法:http://www.cnblogs.com/galaxies/p/hdu1024.html 原来的解法思路是正着,我们加数,现在考虑删数 我们先特判几种情况(可以全选正,全选正还不够) 现在只剩下一种情况,段数<正数段数 我们可以把数字合并…
题目链接:https://cn.vjudge.net/problem/HDU-1024 题意 给n, m和一个序列,找m个不重叠子串,使这几个子串内元素和的和最大. n<=1e6 例:1 3 1 2 3 答:6 (唯一的子串1 2 3) 思路 先顺便记录一下动态规划的一般解题思路: 原问题->子问题->状态->转移->边界 再顺便记录一下最大值最小化这类问题套路解法: 二分 贪心 不能二分的问题,贪心八九不离十. 一般是AB和BA这两个元素的顺序,不影响前后变化时,直接算目标…
[题解]最大 M 子段和 Max Sum Plus Plus [Hdu1024] [51nod1052] 传送门:最大 \(M\) 子段和 \(Max\) \(Sum\) \(Plus\) \(Plus\) \([Hdu1024]\) \([51nod1052]\) [题目描述] 给出一个长度为 \(N\) 的序列 ,将这 \(N\) 个数划分为互不相交的 \(M\) 个子段,并使得 \(M\) 个子段的和最大. [样例] 样例输入: 7 2 -2 11 -4 13 -5 6 -2 样例输出:…
题意:求一个序列中的最大 m 段和,m 段不能交叉. dp[i][0/1][j] 表示已经取完第 i 个物品,第 i 个物品取或不取,取到第 j 个子段. 用vis[i][0/1][j] 表示该 dp 值是否存在. 然后当 vis[i][0][j] 存在,即第 i 个物品不取,之前已经取了 j 个子段,可推得: 第 i+1 个不取: dp[i+1][0][j]=max(dp[i+1][0][j],dp[i][0][j]); 第 i+1 个取: dp[i+1][1][j+1]=max(dp[i+1…
动态规划,给定长度为n(≤1e6)的整数数组和整数m,选取m个连续且两两无交集的子区间,求所有方案中使得区间和最大的最大值. dp[i][j]表示结束位置(最后一个区间最后一个元素的位置)为i且选取区间数为j的最大值. 容易得到以下状态转移方程:   又:         考虑到数组的规模和j的更新特征,使用一维滚动数组取代二维数组,最外层循环枚举j到m即可. 用dp[0][i]表示dp[i][j], dp[1][i]表示max(dp[k][j-1]) (k≤i). 复杂度为O(n^2) . #…
状态:d(i,j)它代表前j划分数i部并且包括第一j最佳结果时的数.g(i,j)表示前j划分数i最好的结果时,段,g(m,n)结果,需要. 本题数据较大.需採用滚动数组.注意:这题int类型就够用了,开long long可能会TLE. 用滚动数组后,g[j]表示分成i段时最优结果,最后求出的g[n]即为结果 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i…
#include <cstdio>#include <iostream>const int MAX = 1000005; using namespace std; int num[MAX], pre_max[MAX]; inline int max(int a, int b){ return a > b ? a : b;} int DP(int n, int m){ for(int i = 1; i <= m; ++i) { /*****初始化*****/ int tm…
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 31583    Accepted Submission(s): 11174 Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" proble…
/* dp[i][j]表示取第i个数时分成了j块 要么是将第i个数加入j块中的最后一块,要么是自成一块,加上前面j-1块的和 状态转移方程: dp[i][j]=max(dp[i-1][j]+a[i],max{dp[0][j-1]...dp[i-1][j-1]}) 枚举时j为外层循环,i为内层循环, 用滚动数组压缩j,再记录上一轮的dp[0..i][j]的最大值即可 */ #include<bits/stdc++.h> using namespace std; #define maxn 1000…
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 27976    Accepted Submission(s): 9749 Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem.…