题意:给你一串数字,奇加偶减的计算方法,你求其中一个子串的最大值。
思路:简单的DP
状态转移方程为:(0为偶,1为奇,dp[i][j]表示到j为止,对应的奇或偶数个数的和的最大值)。
dp[1][i] = max(dp[1][i-1],dp[0][i-1]+arr[i]);
dp[0][i] = max(dp[0][i-1],dp[1][i-1]-arr[i]);
#include<cstdio>
#include<cstring>
#include<iostream>
#define N 150001
#define max(a1,b1) (a1)>(b1)?(a1):(b1)
using namespace std;
int arr[N],n,dp[2][N];
int main(void)
{
while(cin>>n)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;++i)
scanf("%d",&arr[i]);
dp[1][2] = max(arr[1],arr[2]);//0表示偶,1表示奇
dp[0][2] = max(0,arr[1]-arr[2]);
for(int i=3;i<=n;++i)
{
dp[1][i] = max(dp[1][i-1],dp[0][i-1]+arr[i]);
dp[0][i] = max(dp[0][i-1],dp[1][i-1]-arr[i]);
}
int ans = max(dp[0][n],dp[1][n]);
cout<<ans<<endl;
}
return 0;
}