AC,但是求助
  • 板块P1388 算式
  • 楼主VK3601
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/9/30 22:09
  • 上次更新2024/10/1 09:32:39
查看原帖
AC,但是求助
1397875
VK3601楼主2024/9/30 22:09

虽然这份代码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;
}
2024/9/30 22:09
加载中...