MnZn求助,为什么记忆化搜索不行而dp可以
  • 板块P1799 数列
  • 楼主lcwx
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/19 17:39
  • 上次更新2023/11/3 08:49:59
查看原帖
MnZn求助,为什么记忆化搜索不行而dp可以
545607
lcwx楼主2023/7/19 17:39

rt,由于本人太蒻,不能直接想出状态转移方程,就先写了个爆搜的程序,然后把爆搜改装成了记忆化搜索

以下为记忆化搜索(只保留了核心部分)

long long dfs(long long d,long long change){
	if(d>n){
		return 0;
	}
	if(f[d][change]!=0){
		return f[d][change];
	}
	long long val=0;
	if(a[d]==d-change){
		val=max(val,dfs(d+1,change)+1);
	}else{
		val=max(val,dfs(d+1,change));
	}
	
	val=max(val,dfs(d+1,change+1));
	f[d][change]=val;
	return val;
}
	cout<<dfs(1,0);

然后TLE了,30分

我想了半天,感觉记忆化搜索推出的状态转移方程是正确的,于是我又写了一个DP

以下为DP(同样只有核心部分)

for(int i=1;i<=n;i++){
		for(int change=0;change<=i;change++){
			f[i][change]=max(f[i][change],f[i-1][change-1]);
			if(a[i]==i-change){
				f[i][change]=max(f[i][change],f[i-1][change]+1);
			}else{
				f[i][change]=max(f[i][change],f[i-1][change]);
			}
			ans=max(ans,f[i][change]);
		}
		
	}

这样可以A,100分

但是理论上~~(也有可能是我太蒻不知道)~~来说记忆化搜索和dp不是等价的吗,为什么记忆化会t而dp不会呢

2023/7/19 17:39
加载中...