题目:
分析: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);
}