返回顶部

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;
    }
    
posted @ 2020-09-25 16:37  _Kolibri  阅读(174)  评论(0)    收藏  举报