Tyvj Q1043(跳格游戏)

内容目录

Problem C:
   简单DP  f[i][0]表示第偶数次到i,f[i][1]表示第奇数次到i
   f[i][0]=max(f[j][1])-a[i]  1<=j<i
   f[i][1]=max(f[j][0])+a[i]  1<=j<i

考虑不走这格的情况f[i][0]=f[i-1][0]  假设能这么走,显然不影响答案而少枚一维

由于偶数扣分 所以最后走的一定是单步

答案为f[n][1]

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<cmath>
#include<functional>
#include<algorithm>
using namespace std;
#define MAXN (30000+10)
int n,a[MAXN],f[MAXN][2]={0};
int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		f[i][1]=a[i];
	}
	for (int i=1;i<=n;i++)
	{
		f[i][1]=max(max(f[i][1],f[i-1][1]),f[i-1][0]+a[i] );

		f[i][0]=max(max(f[i][0],f[i-1][0]),f[i-1][1]-a[i]);
	}
/*	for (int i=1;i<=n;i++) cout<<f[i][1]<<' ';
	cout<<endl;
	for (int i=1;i<=n;i++) cout<<f[i][0]<<' ';
	cout<<endl;

*/
/*
	int ans=f[1][1];
	for (int i=2;i<=n;i++) ans=max(ans,max(f[i][1],f[i][0]));
	cout<<ans<<endl;
*/
	cout<<f[n][1]<<endl;

	return 0;
}