洛谷:P1990 覆盖墙壁(回溯,普及+/提高 )

题目:

在这里插入图片描述

分析:leetcode寒假做过吧,不再赘述,这次能独立想出来不错。

x列放了0个,之后的放置方法。
在这里插入图片描述
x列只放了一个,之后的放置方法。

在这里插入图片描述

直接上述剥离模拟:超时:

#include<bits/stdc++.h>
using namespace std;
int f(int x,int c1)
{
    
    
 if(x==0)
 {
    
    
  if(c1==1) return 0;
  else return 1;
  } 
 if(x<0) return 0;
 int ans=0;
 if(c1==0) 
 {
    
    
  ans=(ans+f(x-1,0)+f(x-2,0)+2*f(x-1,1))%10000;
  } 
 if(c1==1)
 {
    
    
  ans=(ans+f(x-2,0)+f(x-1,1))%10000;
 }
}
int main()
{
    
    
 int m;
 cin>>m;
 cout<<f(m,0); 
} 

在这里插入图片描述

瞄了一下题解是递推,再想想自己的为什么超时,竟然好久才发觉是没有记忆化搜索的原因,太菜了,太菜了。

最长公共子序列不也是这样吗?

添加一个记忆化就ac了。

#include<bits/stdc++.h>
using namespace std;
int A[1000005];
int B[1000005];
int f(int x,int c1)
{
    
    
 if(x==0)
 {
    
    
  if(c1==1) return 0;
  else return 1;
  } 
 if(x<0) return 0;
 int ans=0;
 if(c1==0) 
 {
    
    
  if(A[x]!=-1) return A[x];
  ans=(ans+f(x-1,0)+f(x-2,0)+2*f(x-1,1))%10000;
  A[x]=ans;
  return A[x];
  } 
 if(c1==1)
 {
    
    
  if(B[x]!=-1) return B[x];
  ans=(ans+f(x-2,0)+f(x-1,1))%10000;
  B[x]=ans;
  return B[x];
 }
}
int main()
{
    
    
 int m;
 cin>>m;
 memset(A,-1,sizeof(A));
 memset(B,-1,sizeof(B));
 cout<<f(m,0); 
}

猜你喜欢

转载自blog.csdn.net/weixin_42721412/article/details/108489750
今日推荐