题意:一群牛的初始跳跃高度为0,一些药能提高它们的跳跃能力,奇数次服用药是提高跳跃能力,偶数次降低,求最高高度
思路:见注释
#include<iostream> using namespace std; const int MAX = 150005; int dp[MAX][2],num[MAX];//dp[i][0]表示以第i个数为终点,并且当前决策是偶数次,dp[i][1]表示奇数次 int max(int a,int b) { return a>b?a:b; } int main() { int n; scanf("%d",&n); int i; for(i = 0;i < n;i++) scanf("%d",num+i); dp[1][0] = max(0,num[0] - num[1]);//以第1个数为终点,当前决策是偶数次,有两种情况:是第0 次 ,是第2次,取较大值 dp[1][1] = max(num[0],num[1]);//以第1个数为终点,当前决策是奇数次,也是两种情况:以num[0]为第一次,num[1]为第一次,取取较大值 for(i = 2;i < n;i++) { dp[i][0] = max(dp[i-1][0],dp[i-1][1]-num[i]);//两种情况:1,跳过当前这次,此时的值等于前一次与当前奇偶相同的值 // 2,前一次与当前奇偶相反的值和num[i]合并 dp[i][1] = max(dp[i-1][1],dp[i-1][0]+num[i]); } printf("%d\n",max(dp[n-1][0],dp[n-1][1])); return 0; }