求助,DFS做法,#7和#11WA
  • 板块P1388 算式
  • 楼主asasas
  • 当前回复14
  • 已保存回复14
  • 发布时间2020/7/15 20:16
  • 上次更新2023/11/6 23:04:13
查看原帖
求助,DFS做法,#7和#11WA
261417
asasas楼主2020/7/15 20:16

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;
}
2020/7/15 20:16
加载中...