内容目录
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;
}