POJ_2593最大两不想交子段和问题
来源:互联网 发布:java date setmonth 编辑:程序博客网 时间:2024/05/16 23:39
http://poj.org/problem?id=2593
/*
Description:
思想:对于数据a[],从左向右依次求解以a[i]结尾的最大子段和b[i],
Description:
思想:对于数据a[],从左向右依次求解以a[i]结尾的最大子段和b[i],
然后变b[i]为a[i]左边(包括a[i])的最大字段和。
然后,从右向左遍历,求a[i]右边(包括a[i])的最大子段和sum,输出sum+b[i-1]的 最大值。
*/
#include <iostream>
然后,从右向左遍历,求a[i]右边(包括a[i])的最大子段和sum,输出sum+b[i-1]的 最大值。
*/
#include <iostream>
using namespace std;
const int MAXSIZE = 100000 + 10;
int a[MAXSIZE];
int b[MAXSIZE];
int a[MAXSIZE];
int b[MAXSIZE];
int main()
{
int n;
while(cin>>n && n){
int max = INT_MIN;
int sum = 0;
for(int i = 0; i < n; ++i){
scanf("%d", &a[i]);//cin>>a[i];
sum += a[i];
if(sum > max){
max = sum;
}
b[i] = max;
if(sum < 0){
sum = 0;
}
}
max = INT_MIN;
sum = 0;
int ans = max;
for(int i = n - 1; i > 0; --i){
sum += a[i];
if(sum > max){
max = sum;
}
int temp = max + b[i-1];
if(temp > ans){
ans = temp;
}
if(sum < 0){
sum = 0;
}
}
cout<<ans<<endl;
}
/////system("pause");
return 0;
}
{
int n;
while(cin>>n && n){
int max = INT_MIN;
int sum = 0;
for(int i = 0; i < n; ++i){
scanf("%d", &a[i]);//cin>>a[i];
sum += a[i];
if(sum > max){
max = sum;
}
b[i] = max;
if(sum < 0){
sum = 0;
}
}
max = INT_MIN;
sum = 0;
int ans = max;
for(int i = n - 1; i > 0; --i){
sum += a[i];
if(sum > max){
max = sum;
}
int temp = max + b[i-1];
if(temp > ans){
ans = temp;
}
if(sum < 0){
sum = 0;
}
}
cout<<ans<<endl;
}
/////system("pause");
return 0;
}
- POJ_2593最大两不想交子段和问题
- HDOJ 题目1024 Max Sum Plus Plus(动态规划,不想交子段最大和)
- 求最大子列和问题两种算法比较
- 不想一个人 害怕两个人
- 求连续子数组最大和问题的两种解法_PHP实现
- 最大连续和问题
- 最大字段和问题
- 最大字段和问题
- 最大和问题
- 最大自序和问题
- 最大字段和问题
- 最大字段和问题
- 最大字段和问题
- 最大字串和问题
- 最大字段和问题
- 最大序列和问题
- 最大连续和问题
- 最大序列和问题
- c语言中字符串处理函数
- scanf与gets函数读取字符串的区别
- 华中科技大学2010年复试上机题a+b
- 取石子游戏POJ1067
- POJ_1001 Exponentiation
- POJ_2593最大两不想交子段和问题
- C语言复杂的类型声明
- 差分进化g05测试代码
- Linux命令之tar包
- 自动类型转化的鲜为人知的陷阱
- windows下tracert程序实现
- 统计一个数组中相同元素个数
- 百度之星12月23号题目之du熊做实验
- 百度之星12月23号题目之地铁