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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


不知道能不能用贪心,反正我是没看出来,所以用DP求解。

首先分析一下题意,我们要在一段序列中取出一段子序列,然后让这段子序列按顺序逐个先加后减最终得到的结果最大。

如果要用DP,那么我们首先就要思考怎么表示状态,并且怎么扫能够把所有情况都涵盖。
在这道题里面有两种状态,第一种是应该加的状态,也就是说我们刚刚减完,另一种是应该减的状态,这时候我们刚刚加完一个数。
那么我们就用 f [ i ] [ j ] f[i][j] f[i][j] f [ i ] [ j ] f[i][j] f[i][j] 来表示从前 i i i个里面选,状态为 j j j的所有集合里面能够取到的最大值。
这里的 j j j就直接用 0 0 0 1 1 1来表示就可以了,官方题解是将两个状态拆为了两个DP数组(感觉不太好理解)。

在这里用 0 0 0 表示上一次减完的状态, 1 1 1 表示上一次加完的状态。
那么我们很容易知道,只有在第 i − 1 i-1 i1次处于减过了一个数的状态才能够进行加操作或者不进行操作,这时候的状态转移方程就是 f [ i ] [ 1 ] = m a x ( f [ i − 1 ] [ 1 ] , f [ i − 1 ] [ 0 ] + a [ i ] ) f[i][1] = max(f[i-1][1],f[i-1][0] +a[i]) f[i][1]=max(f[i1][1],f[i1][0]+a[i])

只有第i-1次加过了一个数的状态才能够进行减操作或者不进行操作,这时候的状态表示为 f [ i ] [ 0 ] = m a x ( f [ i − 1 ] [ 0 ] , f [ i − 1 ] [ 1 ] − a [ i ] ) f[i][0] = max(f[i-1][0],f[i-1][1] - a[i]) f[i][0]=max(f[i1][0],f[i1][1]a[i])


CODE:

#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
#define int long long

int a[N];
int f[N][2];
//1 - / 0 +

void solve(){
    int n,q;cin >> n >> q;

    for(int i = 1;i <= n;i++)cin >> a[i];


    for(int i = 1;i <= n;i++){
        f[i][1] = max(f[i-1][1],f[i-1][0] + a[i]);
        f[i][0] = max(f[i-1][0],f[i-1][1] - a[i]);
    }

    cout << max(f[n][1],f[n][0]) << endl;
}

signed main(){
    int T;cin >> T;
    while(T--){
        solve();
    }
    return 0;
}

相关推荐

  1. Codeforces Round 959(Div. 1 + Div. 2)A~C

    2024-07-22 10:12:02       20 阅读
  2. PokéLLMon 源码解析(四)

    2024-07-22 10:12:02       30 阅读
  3. PokéLLMon 源码解析(二)

    2024-07-22 10:12:02       32 阅读
  4. PokéLLMon 源码解析(一)

    2024-07-22 10:12:02       33 阅读
  5. torch.squeeze() dim=1 dim=-1 dim=2

    2024-07-22 10:12:02       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 10:12:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 10:12:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 10:12:02       45 阅读
  4. Python语言-面向对象

    2024-07-22 10:12:02       55 阅读

热门阅读

  1. QT表格显示MYSQL数据库源码分析(七)

    2024-07-22 10:12:02       16 阅读
  2. Github 2024-07-22开源项目日报Top10

    2024-07-22 10:12:02       13 阅读
  3. 十六、多任务

    2024-07-22 10:12:02       14 阅读
  4. 目标检测的隐形威胁:对抗攻击的深度解析

    2024-07-22 10:12:02       18 阅读
  5. ASP.NET Core Web深度探讨

    2024-07-22 10:12:02       15 阅读
  6. opencv—常用函数学习_“干货“_13

    2024-07-22 10:12:02       18 阅读
  7. 高精度-大整数计算模板

    2024-07-22 10:12:02       18 阅读
  8. Anonymous Informant

    2024-07-22 10:12:02       16 阅读
  9. Oracle(16)什么是视图(View)?

    2024-07-22 10:12:02       20 阅读
  10. kotlin中常见的创建协程的方式

    2024-07-22 10:12:02       13 阅读