题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2713
题意:有N个点,每个点都有一个值x,每次进行跳跃,当跳到自己所跳的第奇数个点是+x,第偶数个点时-x。
分析:这题dp状态转移方程不难想,dp[i][0]表示偶次数跳到第i个点是达到的最大值,dp[i][1]表示奇次数跳到第i个点达到的最大值。
则有:
dp[0][i]=max(dp[0][i-1],dp[1][i-1]-x)
dp[1][i]=max(dp[0][i-1]+x,dp[1][i-1])
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define LL long long #define mod 1000000007 #define inf 0x3f3f3f3f #define N 150010 #define clr(a) (memset(a,0,sizeof(a))) using namespace std; int dp[2][N]; int main() { int n,x; while(scanf("%d",&n)>0) { memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { scanf("%d",&x); dp[0][i]=max(dp[1][i-1]-x,dp[0][i-1]); dp[1][i]=max(dp[1][i-1],dp[0][i-1]+x); } printf("%d\n",max(dp[0][n],dp[1][n])); } }
时间: 2025-01-02 00:13:05