https://vjudge.net/contest/430905#problem/A
医生给牛吃药,使牛可以跳起来,跳到他想去的地方,从零开始,奇数次的时候是得到格子里的能量,偶数次是失去能量。可以间隔跳。
问它最大能得到多少能量。
我实在是不懂动态规划,一开始只能想到判断一个数的两边是不是都比他大,或者都小,才能得到最值。不贴这个代码了。
还是说下别人写的吧。
又是用了一个二维数组,一行储存偶数时候的值,另一行储存奇数时候的值。
不画图都看不懂原理。偶数行记录的是上一个奇数次的值减去这个数和上一个偶数次的值中选择大数。奇数行同理,改为加即可。
#include<iostream>
using namespace std;
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int main()
{
int n;
while(cin >> n)
{
int a[150006]= {0};
int d[150006][2]={0};
for(int i=1; i<=n; i++)
{
cin >> a[i];
}
for(int i=1; i<=n; i++)
{
d[i][0]=max(d[i-1][0],d[i-1][1]-a[i]);
//判断上一个偶数次和上一个奇数次减去这个数谁大
d[i][1]=max(d[i-1][1],d[i-1][0]+a[i]);
//判断上一个奇数次和上一个偶数次加上这个数谁大
}
cout << max(d[n][0],d[n][1])<< endl;
}
return 0;
}