原题: http://poj.org/problem?id=2181
题意:有p个数,每个数都是正数,从左到右 每次我们可以从中选1个数,在第偶数次选中的数,我们要减去arr[i],在奇数次选中的数,我们可以加上它arr[i],问最后能够得到的结果最大是多少?
思路:ou[i]表示前i个取偶数个的得到最大值 , ji[i]表示前i个取奇数个的得到的最大值
如果第i个数是奇数次被选到的有三种情况: ji[i]=ji[i-1](前面i-1个取奇数个,当前这个不要) ji[i]=ou[i-1]+arr[i](前i-1个取偶数个,加上当前这个) 取最大的方案
如果第i个数是在偶数次被选到的,有两种情况:ou[i]=ou[i-1](前面I-1个取偶数个,当前这个不要) ou[i]=ji[i-1]-arr[i](前i-1个取奇数个,加上当前这个) 取最大的方案
遍历完所有的数字之后,我们输出ji[p] 和 ou[p] 较大的那个即可。
#include<cstdio>
int max(int a,int b)
{
if(a>=b)return a;
return b;
}
int main()
{
const int size=150010;
int arr[size];
int p;
while(~scanf("%d",&p))
{
int ji[size]={0};
int ou[size]={0};
scanf("%d",&arr[1]);
ou[1]=0;
ji[1]=arr[1];
for(int i=2;i<=p;i++)
{
scanf("%d",&arr[i]);
ji[i]=max(ji[i-1],ou[i-1]+arr[i]);
ou[i]=max(ou[i-1],ji[i-1]-arr[i]);
}
printf("%d\n",max(ji[p],ou[p]));
}
return 0;
}