传送门2018焦作区域赛网络预选赛B: Mathematical Curse(dp)_i++ 表示在第 2018焦作区域赛网络预选赛B: Mathematical Curse(dp)_i++_02 间房做 2018焦作区域赛网络预选赛B: Mathematical Curse(dp)_#define_03 个操作 2018焦作区域赛网络预选赛B: Mathematical Curse(dp)_i++_02 一定是不能小于 2018焦作区域赛网络预选赛B: Mathematical Curse(dp)_#define_03 加和减的话比较常规 乘除涉及到负数的话就不一定了
所以需要既存最大值也要存最小值

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1010;
char op[10];
int dp1[10][maxn],dp2[10][maxn],x[maxn];
int opeator(int x,int y,char op)
{
    if(op == '+')
        return x + y;
    else if(op == '-')
        return x - y;
    else if(op == '*')
        return x * y;
    else if(op == '/')
        return x / y;
}
signed main()
{
    int T,N,M,K;
    scanf("%lld",&T);
    while(T--)
    {
        scanf("%lld%lld%lld",&N,&M,&K);
        for(int i = 0;i < N; i++)
            scanf("%lld",&x[i]);
        scanf("%s",op);
        dp1[0][0] = dp2[0][0] = opeator(K,x[0],op[0]);
        for(int i = 1;i < N - M + 1; i++)
        {
            dp1[0][i] = max(dp1[0][i-1],opeator(K,x[i],op[0]));
            dp2[0][i] = min(dp2[0][i-1],opeator(K,x[i],op[0]));
        }
        for(int i = 1;i < M; i++)
        {
            dp1[i][i] = opeator(dp1[i-1][i-1],x[i],op[i]);
            dp2[i][i] = opeator(dp2[i-1][i-1],x[i],op[i]);
            for(int j = i + 1;j < N - M + 1 + i; j++)
            {
                int tmp1 = opeator(dp1[i-1][j-1],x[j],op[i]);
                int tmp2 = opeator(dp2[i-1][j-1],x[j],op[i]);
                dp1[i][j] = dp1[i][j-1];
                dp2[i][j] = dp2[i][j-1];
                dp1[i][j] = max(dp1[i][j],max(tmp1,tmp2));
                dp2[i][j] = min(dp2[i][j],min(tmp1,tmp2));
            }
        }
        printf("%lld\n",dp1[M-1][N-1]);
    }
    return 0;
}