Codeforces Round #672 (Div. 2) C1. Pokémon Army (easy version) (DP)

-
题意:给你一组数\(a\),构造一个它的子序列\(b\),然后再求\(b_1-b2+b3-b4...\),问构造后的结果最大是多少.
-
题解:线性DP.我们用\(dp1[i]\)来表示在\(i\)位置,并且此时子序列的长度是奇数的情况,而\(dp2\)则是偶数情况,对于每个\(a_i\),\(dp[i]\)都可以选它或者不选,拿\(dp1[i]\)举例,如果选择\(a_i\),那么状态则可以从子序列中上一个位置转移过来,所以\(dp1[i]=dp2[i-1]+a[i]\),如果不选就是\(dp1[i]=dp1[i-1]\),二者维护一个最大值即可,对于\(dp2\)来说也是一样.
-
代码:
int t; int n,q; int a[N]; ll dp1[N],dp2[N]; int main() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); cin>>t; while(t--){ cin>>n>>q; for(int i=1;i<=n;++i){ cin>>a[i]; } for(int i=1;i<=n;++i){ dp1[i]=max(dp1[i-1],dp2[i-1]+a[i]); dp2[i]=max(dp2[i-1],dp1[i-1]-a[i]); } cout<<max(dp1[n],dp2[n])<<endl; } return 0; }
𝓐𝓬𝓱𝓲𝓮𝓿𝓮𝓶𝓮𝓷𝓽 𝓹𝓻𝓸𝓿𝓲𝓭𝓮𝓼 𝓽𝓱𝓮 𝓸𝓷𝓵𝔂 𝓻𝓮𝓪𝓵
𝓹𝓵𝓮𝓪𝓼𝓾𝓻𝓮 𝓲𝓷 𝓵𝓲𝓯𝓮

浙公网安备 33010602011771号