记忆化搜索AC了,但是有疑问
查看原帖
记忆化搜索AC了,但是有疑问
882092
zMinYu楼主2023/5/20 13:49

最终为什么输出dfs(1,n,0,1),而不是dfs(1,n,0,1)+dfs(1,n,0x3f3f3f3f,0)呢?

可以从左边开始取,也可以从右边开始取啊。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n;
int h[1005];
int f[1005][1005][2];
const int mod=19650827;
int dfs(int l,int r,int val,int left)
{
	if(f[l][r][left]!=-1) 
	return f[l][r][left];
	if(l==r)
	{
		if(left)
		{
			if(h[l]>val)
			return (f[l][r][left]=1);
		}
		else
		{
			if(h[l]<val)
			return (f[l][r][left]=1);
		}
		return (f[l][r][left]=0);
	} 
	int ans=0;
	if(left)
	{
		if(h[l]>val)
		{
			ans+=dfs(l+1,r,h[l],1);
		}
		if(h[r]>val)
		{
			ans+=dfs(l,r-1,h[r],0);
		}
	}
	if(!left)
	{
		if(h[l]<val)
		{
			ans+=dfs(l+1,r,h[l],1);
		}
		if(h[r]<val)
		{
			ans+=dfs(l,r-1,h[r],0);
		}
	}
	ans=ans%mod;
	f[l][r][left]=ans;
	return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    memset(f,-1,sizeof(f));
    cin>>n;
    for(int i=1;i<=n;i++)
    {
    	cin>>h[i];
	}
	cout<<dfs(1,n,0,1);
	return 0;         
}
2023/5/20 13:49
加载中...