传送门 表示在第 间房做 个操作 一定是不能小于 加和减的话比较常规 乘除涉及到负数的话就不一定了
所以需要既存最大值也要存最小值
#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;
}