求助 记忆化搜索 最后一个点WA
查看原帖
求助 记忆化搜索 最后一个点WA
64974
Tirpitz__楼主2021/9/9 21:21
#include<bits/stdc++.h>

using namespace std;
#define ll long long 
#define pre(x) (x-1<=0?n:x-1)
const int N=500;
ll num[N],f[N][N];
int op[N];
bool vis[N][N];
int n;
vector<int> line;
ll dp(int l,int r)
{
	if(l==r)
	{
		return num[l];
	}
	if(vis[l][r])
	return f[l][r];
	for(int k=l;k<r;k++)
	{
		ll lx1=dp(l,k),lx2=dp(k+1,r);
		if(!vis[l][r])
		f[l][r]=op[k]==1?lx1+lx2:lx1*lx2,vis[l][r]=1;
		else f[l][r]=max(f[l][r],op[k]==1?lx1+lx2:lx1*lx2);
	}
	return f[l][r];
}
int main()
{
	scanf("%d",&n);
	char str[3];
	int temp;
	for(int i=1;i<=n;i++)
	{
		scanf("%s%d",str,&temp);
		if(str[0]=='t')
		op[pre(i)]=1;
		else op[pre(i)]=2;
		num[i]=temp;
	}
	for(int i=1+n;i<=n+n;i++)
	{
		num[i]=num[i-n];
		op[i]=op[i-n];
	}
	ll rua=-100000000;
	for(int i=1;i<=n;i++)
	{
		ll rya=dp(i,i+n-1);
		if(rya>=rua)
		{
			if(rya>rua)
			{
				line.clear();
				line.push_back(i);
				rua=rya;
			}
			else {
				line.push_back(i);
			}
		}
		memset(vis,0,sizeof(vis));
	}
	printf("%lld\n",rua);
	for(int i=0;i<line.size();i++)
	{
		printf("%d ",line[i]);
	}
	return 0;
}

在我的程序中 op[i]对应的操作对象为num[i]与num[i+1]

op[i]==1代表加法

op[i]==2代表乘法

2021/9/9 21:21
加载中...