虽然这份代码AC了,但是我前面出错时加法和乘法运算的数量变成了负数,导致91.实在找不到问题,就写了个特判,求助各位大佬,能帮忙看下具体哪里出了问题,感激不尽!
#include<bits/stdc++.h>
using namespace std;
int n,k,a[20];
int f[20][20][20][20];
int dfs(int l,int r,int che,int jia){
//特判 处理负数(问题就在这里)
if(jia<0||che<0)return -2147483648;
//算过了
if(f[l][r][che][jia]!=-1)return f[l][r][che][jia];
//只剩一个值
if(l==r)return a[l];
//只剩一种运算
if(che==0){
int ans=0;
for(int i=l; i<=r; i++)ans+=a[i];
return f[l][r][che][jia]=ans;
}
if(jia==0){
int ans=1;
for(int i=l; i<=r; i++)ans*=a[i];
return f[l][r][che][jia]=ans;
}
//处理两边
int d2,ans=max(a[l]*dfs(l+1,r,che-1,jia),a[l]+dfs(l+1,r,che,jia-1));
ans=max(ans,max(a[r]*dfs(l,r-1,che-1,jia),a[r]+dfs(l,r-1,che,jia-1)));
for(int i=l+1; i<r-1; i++){
for(int j=0; j<=min(i-l,che); j++){
int d1=dfs(l,i,j,i-l-j);
//两种运算 注意要判断一下 防止有负数(但好像没防止了负数)
if(j<che){
d2=dfs(i+1,r,che-j-1,jia-(i-l-j));
ans=max(ans,d1*d2);
}
if((i-l-j)+1<=jia){
d2=dfs(i+1,r,che-j,jia-(i-l-j)-1);
ans=max(ans,d1+d2);
}
}
}
//记忆化
return f[l][r][che][jia]=ans;
}
int main(){
//初始化
memset(f,-1,sizeof(f));
cin>>n>>k;
for(int i=0; i<n; i++){
cin>>a[i];
}
cout<<dfs(0,n-1,k,n-k-1);
return 0;
}