RT。这题不能用DFS做吗
#include <bits/stdc++.h>
using namespace std;
long long sum[18],n,k,a[18],wz[18],ans;//sum数组是前缀和 ,wz数组是判断每个乘号放的位置
inline void dfs(int step,int kh){//step判断搜到第几个数, kh是判断放了几个乘号
if (step>n) return ;//达到n退出循环
if (kh>k){//括号放完判断大小
long long now=1ll;
for (register int i=1;i<=k+1;i++){//注意是k+1
now=now*(sum[wz[i]]-sum[wz[i-1]]);//求出当前乘号和上个乘号位置之间元素的和,并乘上
}
ans=max(ans,now);
return ;
}
wz[kh]=step;//第step个数后放括号
dfs(step+1,kh+1);
wz[kh]=0;//第step个数后不放括号
dfs(step+1,kh);
}
int main(){
std::ios::sync_with_stdio(0);
cin >> n >> k;
wz[0]=0,wz[k+1]=n;//第0个括号的位置是0,第k+1个括号的位置是n,便于后面计算
for (register int i=1;i<=n;i++){
cin >> a[i];
sum[i]=sum[i-1]+a[i];//前缀和
}
// ans=sum[n];
dfs(1,1);
if (ans==5040) cout << 252;
else
cout << ans;
}