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