POJ 2479 Maximum sum 动态规划 最大子段和 最大子段积
2018-03-01 16:44
519 查看
http://poj.org/problem?id=2479
题意:在给出的数列中找到不相交的两个子段和,使和最大。分析:对每个i求出[0~i-1]的最大子段和以及[i~n-1]的最大子段和,再相加求最大值。在输入时,进行一次dp,求出从左到右的最大和,保存在dp[i]中(其中求和时sum若小于0则前面的数不用再计算,置0)。然后再从右向左进行一次dp,并不断将ans与sum+dp[i-1]比较取最大值。#include<iostream>
#include<cmath>
using namespace std;
const int Min = -999999999;
int a[50005], dp[50005];
int main()
{
int T, n, sum, MAX, ans;
cin >> T;
while (T--)
{
cin >> n;
sum = 0; MAX = Min;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
sum += a[i];
if (sum > MAX)
MAX = sum;
dp[i] = MAX;//[1,i]最大子段和
if (sum < 0) sum = 0;
}
ans = MAX = Min; sum = 0;
for (int i = n; i > 1; i--)
{
sum += a[i];
if (sum > MAX)
MAX = sum;//i~n最大子段和
if (ans < MAX + dp[i - 1])
ans = MAX + dp[i - 1];
if (sum < 0) sum = 0;
}
cout << ans << endl;
}
return 0;
}
最大子段积:考虑存在负数的情况(负负得正),需要分别记录当前最大正数和最小负数
题意:在给出的数列中找到不相交的两个子段和,使和最大。分析:对每个i求出[0~i-1]的最大子段和以及[i~n-1]的最大子段和,再相加求最大值。在输入时,进行一次dp,求出从左到右的最大和,保存在dp[i]中(其中求和时sum若小于0则前面的数不用再计算,置0)。然后再从右向左进行一次dp,并不断将ans与sum+dp[i-1]比较取最大值。#include<iostream>
#include<cmath>
using namespace std;
const int Min = -999999999;
int a[50005], dp[50005];
int main()
{
int T, n, sum, MAX, ans;
cin >> T;
while (T--)
{
cin >> n;
sum = 0; MAX = Min;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
sum += a[i];
if (sum > MAX)
MAX = sum;
dp[i] = MAX;//[1,i]最大子段和
if (sum < 0) sum = 0;
}
ans = MAX = Min; sum = 0;
for (int i = n; i > 1; i--)
{
sum += a[i];
if (sum > MAX)
MAX = sum;//i~n最大子段和
if (ans < MAX + dp[i - 1])
ans = MAX + dp[i - 1];
if (sum < 0) sum = 0;
}
cout << ans << endl;
}
return 0;
}
最大子段积:考虑存在负数的情况(负负得正),需要分别记录当前最大正数和最小负数
int maxProduct(vector<int>& nums) { // write your code here int posMax = nums[0]; int negMax = nums[0]; int ret = nums[0]; for (int i = 1; i<nums.size(); i++) { int tempPosMax = posMax; int tempNegMax = negMax; posMax = max(nums[i], max(nums[i] * tempPosMax, nums[i] * tempNegMax)); negMax = min(nums[i], min(nums[i] * tempPosMax, nums[i] * tempNegMax)); ret = max(ret, posMax); } if (ret < 0) return -1; else return ret; }
相关文章推荐
- POJ 2479 动态规划 最大子序列问题(两段) Maximum sum
- poj 2479 Maximum sum(最大m子段,滚动数组,优化)
- POJ 2479 Maximum sum (DP&双最大子段和)
- poj 2479 Maximum sum 两段不相交最大子段和
- Maximum sum(poj 2479 最大m子段和)
- POJ-2479 Maximum sum (不连续的最大子段和)
- POJ 2479(动态规划) [求最大子段和 的延伸]
- POJ 2479 动态规划 最大子段和
- 【动态规划(最大子序列和)】:poj2479,Maximum sum
- poj 2479 Maximum sum(求最大子段和的延伸)
- poj 2479 Maximum sum(求最大子段和的延伸)
- poj 2479 Maximum sum(求最大子段和的延伸)
- [ACM] POJ 2479 Maximum sum (动态规划求不相交的两段子段和的最大值)
- poj 2479 Maximum sum 最大连续子串的变异
- poj-2479 Maximum sum 【最大字串和】
- POJ 2479 最大子段和dp
- POJ 2479 Maximum sum(2次最大字段和)
- POJ2018 Best Cow Fences——二分答案+贪心(动态规划)求最大子段和——pku2018
- POJ 2479 最大子段和 解题心得
- poj 2479 dp Maximum sum求两段连续不重叠子段的最大和