Luogu3170 128MB过不去
LOJ2099 256MB能卡过
BZOJ3934 512MB怎么都过的去
求在\(30*30\)的方格上放\(3\)个\(L\)的方案 , 有障碍
拓展这条路的时候只能向下或向右走 , 可以设出\(F[x][y][re][s][ty]\)
表示到了\((x,y)\) , 还剩下\(re\)个\(L\)没有放 , 状态为\(s\) , 当前路径是否正在向右走
由于可能的转移只能是路径向下或向右延伸,因此我们可以推出转移方式(以下可以直接看代码):
若当前格子在一条向下走的路径上,那么他有向下和向右两种转移。
若当前格子在一条向右走的路径上,那么他有向右和停止两种转移。
若当前格子不在路径上,并且\(res>0\)&&\(y≠m\),那么他可以作为一条路径的起点。
若当前格子是障碍格,并且处在一条路径上,那么返回\(0\)。
若当前格子同时在一条向右走的路径和向下走的路径上,那么返回\(0\)。
若当前\(y>m\),跳到下一行。
若当前\(x>n\),但还有\(L\)没放或者还有路径在向下走,那么返回\(0\),否则返回\(1\)。
总状态数实测只有\(4150\)以下,可以离散化一下 , 记忆化搜索比较方便
原始题解及代码
\(263MB\)只能在\(BZOJ\)上过
// luogu-judger-enable-o2
#include
#include
#include
#include
#include
可以卡到\(247MB\)的代码
#include
using namespace std;
typedef long long ll;
map P;
char a[32][32];
int n,m,num[4327],cnt=0;
ll f[31][31][4][4327][2];//最大开这么多,254MB了
ll dfs(int x,int y,int re,int s,bool r){
ll& res=f[x][y][re][s][r];
if(~res)return res;
int S=num[s];
if(x==n){
if(!re&&!S)return res=1;
return res=0;
}
if(y==m){
if(r)return res=0;
return res=dfs(x+1,0,re,s,0);
}
if(S&(1<0&&y
\(254MB\)记录