hdu2713

/*
分析:
    递推。
    以前见到过这个题,不过没有写出来,这次小比赛倒是写出来了,
是压力的缘故么= =I。
    第一维代表当前读入的第i个东西是被当做偶数干掉、还是按照奇
数被干掉了。第二维的三个代表这个东西是被扔掉了、还是被用来增高
了、还是被用来负增长了。

                                           2013-04-29
*/






#include"iostream"
#include"cstdio"
#include"cstring"
using namespace std;
const int N=155555;
int dp[2][3][N];		//0跳过去,1升、2降
int max(int a,int b){
	return a>b?a:b;
}
int main()
{
	int i,l,j;
	int n,time,temp;
	while(scanf("%d",&n)!=-1)
	{
		time=0;
		memset(dp,0,sizeof(dp));
		for(i=1;i<=n;i++)
		{
			scanf("%d",&temp);
			//不吃
			for(l=0;l<3;l++)
			{
				dp[0][0][i]=max(dp[0][0][i],dp[0][l][i-1]);
				dp[1][0][i]=max(dp[1][0][i],dp[1][l][i-1]);
			}
			//奇数吃升高
			for(l=0;l<3;l++)	dp[1][1][i]=max(dp[1][1][i],dp[0][l][i-1]+temp);
			//偶数吃降低
			for(l=0;l<3;l++)	dp[0][0][i]=max(dp[0][0][i],dp[1][l][i-1]-temp);
		}

		int ans=0;
		for(l=0;l<3;l++)
		for(j=0;j<2;j++)
			if(dp[j][l][n]>ans)	ans=dp[j][l][n];
		cout<<ans<<endl;
	}
	return 0;
}


你可能感兴趣的:(hdu2713)