poj 2479 最大子数段
2012-11-13 21:44
281 查看
由题意通过提示可以知道 这组数据最大子数段是可以相连着呢,所以可以从左往右搜一次,然后从右往左搜一次,最后取最大值
比较注意
#include<stdio.h>
#include<string.h>
int num[50010];
int leftmax[50010];
int rightmax[50010];
int pre[50010];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T,n,zmax,l,r;
scanf("%d",&T);
while(T--)
{
memset(leftmax,0,sizeof(leftmax));
memset(rightmax,0,sizeof(leftmax));
memset(pre,0,sizeof(pre));
memset(num,0,sizeof(num));
int max_pre;
max_pre = -20000;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
//从左往右搜
leftmax[0] = num[0];
for(int i=1;i< n;i++)
{
leftmax[i]=max(leftmax[i-1]+num[i],pre[i-1]+num[i] );
pre[i-1] = max_pre;
if(leftmax[i] > max_pre)
max_pre = leftmax[i];
l =leftmax[i];
}
pre[0] = num[0];
pre[n-1] = l;
for(int i=0;i<n;i++)
{
leftmax[i] = pre[i];
}
//从右往左搜
max_pre = -20000;
memset(pre,0,sizeof(pre));
rightmax[n-1] = num[n-1];
for(int i=n-2; i>=0;i--)
{
rightmax[i] = max(rightmax[i+1]+num[i],pre[i+1]+num[i]);
pre[i+1] = max_pre;
if(rightmax[i] > max_pre)
max_pre = rightmax[i];
r = rightmax[i];
}
pre[n-1] = num[n-1];
pre[0] = r;
for(int i=n-1;i>=0;i--)
{
rightmax[i] =pre[i];
}
//两次相加
zmax = -20000;
for(int i=0;i<n-1;i++ )
{
if(zmax < leftmax[i]+rightmax[i+1])
zmax = leftmax[i]+rightmax[i+1];
}
printf("%d\n",zmax);
}
}
的是别弄混了
比较注意
#include<stdio.h>
#include<string.h>
int num[50010];
int leftmax[50010];
int rightmax[50010];
int pre[50010];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T,n,zmax,l,r;
scanf("%d",&T);
while(T--)
{
memset(leftmax,0,sizeof(leftmax));
memset(rightmax,0,sizeof(leftmax));
memset(pre,0,sizeof(pre));
memset(num,0,sizeof(num));
int max_pre;
max_pre = -20000;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
//从左往右搜
leftmax[0] = num[0];
for(int i=1;i< n;i++)
{
leftmax[i]=max(leftmax[i-1]+num[i],pre[i-1]+num[i] );
pre[i-1] = max_pre;
if(leftmax[i] > max_pre)
max_pre = leftmax[i];
l =leftmax[i];
}
pre[0] = num[0];
pre[n-1] = l;
for(int i=0;i<n;i++)
{
leftmax[i] = pre[i];
}
//从右往左搜
max_pre = -20000;
memset(pre,0,sizeof(pre));
rightmax[n-1] = num[n-1];
for(int i=n-2; i>=0;i--)
{
rightmax[i] = max(rightmax[i+1]+num[i],pre[i+1]+num[i]);
pre[i+1] = max_pre;
if(rightmax[i] > max_pre)
max_pre = rightmax[i];
r = rightmax[i];
}
pre[n-1] = num[n-1];
pre[0] = r;
for(int i=n-1;i>=0;i--)
{
rightmax[i] =pre[i];
}
//两次相加
zmax = -20000;
for(int i=0;i<n-1;i++ )
{
if(zmax < leftmax[i]+rightmax[i+1])
zmax = leftmax[i]+rightmax[i+1];
}
printf("%d\n",zmax);
}
}
的是别弄混了
相关文章推荐
- [DP动归]-POJ-2479-最大两段子串和
- poj 2479 Maximum sum 最大数字连续和
- POJ 2479 动态规划 最大子序列问题(两段) Maximum sum
- POJ 2479 Maximum sum 动态规划 最大子段和 最大子段积
- POJ-2479 Maximum sum (不连续的最大子段和)
- POJ 2479 不相交最大子段和
- poj 2479 Maximum sum (最大字段和的变形)
- POJ 2479 最大子段和dp
- POJ_2479 最大连续子序列和
- poj 2479 Maximum sum (子序列和最大问题)
- poj 2479 Maximum sum 两段不相交最大子段和
- poj_2479_Maximum sum(最大两子段和)
- POJ 2479 Maximum sum(2次最大字段和)
- poj 2479 Maximum sum(求最大子段和的延伸)
- poj 2479 最大子序列和变形
- 动态规划(DP),递推,最大子段和,POJ(2479,2593)
- 51nod 1052最大M子段和 & poj 2479最大两子段和
- poj 2479 Maximum sum(求最大子段和的延伸)
- poj 2479 最大连续子段和
- POJ 2479 Maximum sum (DP&双最大子段和)