[arc066e]Addition and Subtraction Hard

本文介绍了一种使用动态规划解决表达式最大值问题的方法。通过放置括号来最大化包含加减运算的算术表达式的值。文章详细讨论了状态定义及转移方程,并给出了完整的C++代码实现。

题目大意

一个表达式有+有-,添加一些括号最大化表达式的值。

DP

首先只会在-号前放左括号。
简单的想法是设f[i,j]表示做完前i个数字,目前还有j个左括号没有匹配右括号。
然后很难发现,j<=2才有意义。

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=100000+10;
const ll inf=1000000000000000000;
int a[maxn];
char s[maxn];
ll f0,f1,f2;
int i,j,k,l,t,n,m;
int read(){
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9'){
        if (ch=='-') f=-1;
        ch=getchar();
    }
    while (ch>='0'&&ch<='9'){
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
char get(){
    char ch=getchar();
    while (ch!='+'&&ch!='-') ch=getchar();
    return ch;
}
int main(){
    n=read();a[0]=read();
    n--;
    fo(i,1,n){
        s[i]=get();
        a[i]=read();
    }
    f0=a[0];f1=f2=-inf;
    fo(i,1,n){
        if (s[i]=='-'){
            f0-=(ll)a[i];
            f1+=(ll)a[i];
            f2-=(ll)a[i];
            if (f1>f2) f2=f1;
            if (f0>f1) f1=f0;
        }
        else{
            f0+=(ll)a[i];
            f1-=(ll)a[i];
            f2+=(ll)a[i];
        }
        if (f2>f1) f1=f2;
        if (f1>f0) f0=f1;
    }
    printf("%lld\n",f0);
}
### 元素级加法和减法的操作 在数组、矩阵或张量的运算中,元素级加法(Elementwise addition)和减法(Elementwise subtraction)是一种常见的操作。这些操作会将两个相同形状的数组、矩阵或张量中的对应元素逐一相加或相减[^1]。 在数学表示上,假设存在两个大小相同的数组 \( A \) 和 \( B \),其维度为 \( n \times m \)。元素级加法的结果 \( C \) 可以通过以下公式计算: \[ C[i][j] = A[i][j] + B[i][j] \] 同样地,元素级减法的结果 \( D \) 为: \[ D[i][j] = A[i][j] - B[i][j] \] 在实际编程中,使用 NumPy 或 TensorFlow 等库可以轻松实现这些操作。以下是使用 Python 和 NumPy 的代码示例: ```python import numpy as np # 定义两个数组 A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) # 元素级加法 C = A + B print("Elementwise Addition:\n", C) # 元素级减法 D = A - B print("Elementwise Subtraction:\n", D) ``` 对于深度学习框架中的张量运算,例如 TensorFlow 或 PyTorch,也可以直接应用类似的运算符。以下是 TensorFlow 的示例: ```python import tensorflow as tf # 定义两个张量 A = tf.constant([[1, 2], [3, 4]], dtype=tf.float32) B = tf.constant([[5, 6], [7, 8]], dtype=tf.float32) # 元素级加法 C = tf.add(A, B) print("TensorFlow Elementwise Addition:\n", C.numpy()) # 元素级减法 D = tf.subtract(A, B) print("TensorFlow Elementwise Subtraction:\n", D.numpy()) ``` 值得注意的是,如果两个数组或张量的形状不一致,某些库(如 NumPy 或 TensorFlow)可能会尝试通过广播(Broadcasting)机制调整形状以便进行运算[^1]。 ### 注意事项 - 广播机制允许不同形状的数组或张量进行运算,但前提是它们的维度满足特定规则。 - 如果输入数据的形状不匹配且无法通过广播解决,则会引发错误。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值