题目链接:https://nanti.jisuanke.com/t/A2012
dp[i][j][1]表示取前i个数,j个字符时能获得的最大值
dp[i][j][0]表示取前i个数,j个字符时能获得的最小值
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[1005][10][3];
ll a[1005];
char s[10];
const ll maxn=1e18;
int main()
{
//printf("%lld\n",-maxn);
int t;
scanf("%d",&t);
while(t--)
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
dp[i][j][0]=maxn,dp[i][j][1]=-maxn;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
scanf("%s",s+1);
dp[0][0][1]=dp[0][0][0]=k;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
if(j>i)
break;///注意判断
if(j==0)
{
dp[i][0][1]=dp[i][0][0]=k;
continue;
}
if(s[j]=='+')
{
dp[i][j][1]=max(dp[i-1][j-1][1]+a[i],dp[i-1][j][1]);
dp[i][j][0]=min(dp[i-1][j-1][0]+a[i],dp[i-1][j][0]);
}
else if(s[j]=='-')
{
dp[i][j][1]=max(dp[i-1][j-1][1]-a[i],dp[i-1][j][1]);
dp[i][j][0]=min(dp[i-1][j-1][0]-a[i],dp[i-1][j][0]);
}
else if(s[j]=='*')
{
dp[i][j][1]=max(dp[i-1][j-1][1]*a[i],max(dp[i-1][j][1],dp[i-1][j-1][0]*a[i]));
dp[i][j][0]=min(dp[i-1][j-1][1]*a[i],min(dp[i-1][j][0],dp[i-1][j-1][0]*a[i]));
}
else if(s[j]=='/')
{
dp[i][j][1]=max(dp[i-1][j-1][1]/a[i],max(dp[i-1][j][1],dp[i-1][j-1][0]/a[i]));
dp[i][j][0]=min(dp[i-1][j-1][1]/a[i],min(dp[i-1][j][0],dp[i-1][j-1][0]/a[i]));
}
}
}
printf("%lld\n",dp[n][m][1]);
}
}