补了一发轮廓线DP,发现完全没有必要从右往左设置状态,自然一点:

5 6 7 8 9

1 2 3 4

如此设置轮廓线标号,转移的时候直接把当前j位改成0或者1就行了。注意多记录些信息对简化代码是很有帮助的,尤其对于我这种代码经常错的一塌糊涂的人来说。。

呆马:

POJ 3254 Corn Fields

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#define inf 1000000007
#define oo 100000000
#define maxn 15
#define maxm 5200 using namespace std; int n,m,mb;
int a[maxn][maxn];
int f[maxn][maxn][];
int bit[][maxn]; bool legal(int x, int y,int mask)
{
if (y==) if (bit[mask][y]&bit[mask][y+]) return ;
for (int i=;i<y-;i++) if (bit[mask][i]&bit[mask][i+]) return ;
for (int i=y;i<m;i++) if (bit[mask][i]&bit[mask][i+]) return ;
return ;
} int main()
{
scanf("%d%d",&n,&m);
memset(a,,sizeof(a));
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
scanf("%d",&a[i][j]);
mb=(<<m)-;
for (int mask=;mask<=mb;mask++)
{
int tmp=mask;
for (int i=;i<=m;i++)
{
bit[mask][i]=tmp%;
tmp/=;
}
}
memset(f,,sizeof(f));
f[][m][]=;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
for (int mask=;mask<=mb;mask++)
if (legal(i,j,mask))
{
int tmp=<<(j-);
if (j==)
{
f[i][j][mask&(~tmp)]+=f[i-][m][mask];
f[i][j][mask&(~tmp)]%=oo;
if (!bit[mask][j] && a[i][j])
{
f[i][j][mask|tmp]+=f[i-][m][mask];
f[i][j][mask|tmp]%=oo;
}
}
else
{
f[i][j][mask&(~tmp)]+=f[i][j-][mask];
f[i][j][mask&(~tmp)]%=oo;
if (!bit[mask][j] && a[i][j])
{
f[i][j][mask|tmp]+=f[i][j-][mask];
f[i][j][mask|tmp]%=oo;
}
}
}
int ans=;
for (int mask=;mask<=mb;mask++)
if (legal(n+,,mask))
{
ans+=f[n][m][mask];
ans%=oo;
}
printf("%d\n",ans);
return ;
}

Corn Fields

BZOJ 1087 Kings

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#define inf 1000000007
#define oo 100000000
#define maxn 11
#define maxm 1050 using namespace std; int n,m,mb;
long long f[maxn][maxn][][maxm];
int bit[maxm][maxn]; bool legal(int x, int y,int mask)
{
if (y==)
{
if (bit[mask][n]&bit[mask][n+]) return ;
if (bit[mask][n-]&bit[mask][n+]) return ;
}
else
{
if (bit[mask][y-]&bit[mask][n+]) return ;
if (bit[mask][y-]&bit[mask][n+]) return ;
}
for (int i=;i<n;i++) if (bit[mask][i]&bit[mask][i+]) return ;
return ;
} int main()
{
scanf("%d%d",&n,&m);
mb=(<<(n+))-;
memset(bit,,sizeof(bit));
for (int mask=;mask<=mb;mask++)
{
int tmp=mask;
for (int i=;i<=n+;i++)
{
bit[mask][i]=tmp%;
tmp/=;
}
}
memset(f,,sizeof(f));
f[][n][][]=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
for (int k=;k<=m;k++)
for (int mask=;mask<=mb;mask++)
if (legal(i,j,mask))
{
int tmp=<<(j-);
int ost=mask&(~tmp),nst=mask|tmp;
if (((mask>>(j-))&)!=((mask>>n)&)) ost^=(<<n),nst^=(<<n);
if (j==)
{
f[i][j][k][ost]+=f[i-][n][k][mask];
if (k && !bit[mask][j] && !bit[mask][j+] && !bit[mask][j-])
f[i][j][k][nst]+=f[i-][n][k-][mask];
}
else
{
f[i][j][k][ost]+=f[i][j-][k][mask];
if (k && !bit[mask][j] && !bit[mask][j+] && !bit[mask][j-] && !bit[mask][n+])
f[i][j][k][nst]+=f[i][j-][k-][mask];
}
}
long long ans=;
for (int mask=;mask<=mb;mask++)
if (legal(n+,,mask))
{
ans+=f[n][n][m][mask];
}
printf("%lld\n",ans);
return ;
}

Kings

轮廓线DP POJ3254 && BZOJ 1087的更多相关文章

  1. BZOJ.4572.[SCOI2016]围棋(轮廓线DP)

    BZOJ 洛谷 \(Description\) 给定\(n,m,c\).\(Q\)次询问,每次询问给定\(2*c\)的模板串,求它在多少个\(n*m\)的棋盘中出现过.棋盘的每个格子有三种状态. \( ...

  2. HDU4804 Campus Design 轮廓线dp

    跟上面那篇轮廓线dp是一样的,但是多了两个条件,一个是在原图上可能有些点是不能放的(即障碍),所以转移的时候要多一个判断color[i][j]是不是等于1什么的,另外一个是我们可以有多的1*1的骨牌, ...

  3. POJ2411 Mondriaan's Dream 轮廓线dp

    第一道轮廓线dp,因为不会轮廓线dp我们在南京区域赛的时候没有拿到银,可见知识点的欠缺是我薄弱的环节. 题目就是要你用1*2的多米诺骨排填充一个大小n*m(n,m<=11)的棋盘,问填满它有多少 ...

  4. UVA - 11270 轮廓线DP

    其实这题还能用状压DP解决,可是时间达到2000ms只能过掉POJ2411.状压DP解法详见状压DP解POJ2411 贴上POJ2411AC代码 : 2000ms 时间复杂度h*w*(2^w)*(2^ ...

  5. [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥

    题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...

  6. 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)

    [UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...

  7. 4572: [Scoi2016]围棋 轮廓线DP KMP

    国际惯例的题面:这种题目显然DP了,看到M这么小显然要状压.然后就是具体怎么DP的问题.首先我们可以暴力状压上一行状态,然后逐行转移.复杂度n*3^m+3^(m*2),显然过不去. 考虑状态的特殊性, ...

  8. Solid Dominoes Tilings (轮廓线dp打表 + 容器)

    第一步先打一个表,就是利用轮廓线DP去打一个没有管有没有分界线组合数量的表 #include<bits/stdc++.h> using namespace std; ; <<; ...

  9. HDU 4802 && HDU 4803 贪心,高精 && HDU 4804 轮廓线dp && HDU 4805 计算几何 && HDU 4811 (13南京区域赛现场赛 题目重演A,B,C,D,J)

    A.GPA(HDU4802): 给你一些字符串对应的权重,求加权平均,如果是N,P不计入统计 GPA Time Limit: 2000/1000 MS (Java/Others)    Memory ...

随机推荐

  1. Oracle ITL(Interested Transaction List)理解

    ITL(Interested Transaction List) ITL是位于数据块头部的事物槽列表,它是由一系列的ITS(Interested Transaction Slot,事物槽)组成,其初始 ...

  2. Html笔记

    1. Html就是超文本标记语言的简写,是最基础的网页语言. 2. Html是通过标签来定义的语言,代码都是由标签所组成. 3. Html代码不用区分大小写. 4. Html代码由<html&g ...

  3. bzoj 2058+2059+2060 Usaco2010 Nov

    三道金组比较容易的题目.. 2058 首先交换次数就是逆序对数,因为只能交换相邻的两数 先对原序列找逆序对数 用树状数组nlogn求出 然后O(n)依次求出其循环序列的逆序对数 比如 3 5 4 2 ...

  4. Powershell获取磁盘信息

    使用Powershell完成系统管理实在是太方便了,磁盘信息获取只需几行代码即可. 1: $DiskCount = ((Get-WmiObject -Class Win32_DiskDrive).Ca ...

  5. 简单快速部署samba服务器

    samba是一种在linux环境运行的免费软件,可以为局域网内的不同计算机系统之间提供文件以及打印机等资源的共享服务. samba服务安装和配置: 1.安装gcc编译器以及samba服务和samba依 ...

  6. Oracle数据库的导入导出

    1.导出Oracle数据 A.使用命令行导出数据 exp username/password @database file= fullpath(如:D:\data.dmp) full=y B.使用工具 ...

  7. Angular-ngtable联动全选

    之前于Angular第三方插件ngTable的官网demo上看到的例子,但苦于demo中联动全选为选中所有,项目中并不适用,因此做了下小小的修改,修改目的只是为实现其功能,方法不敢苟同,若有更加简便的 ...

  8. EditText添加了ImageSpan后,在两者中间不能输入纯文本

    严格来说是连续插入两个ImageSpan之后,在其中间不能够输入纯文本内容. 最后发现问题出现在了SpannableString在设置ImageSpan的时候第四个参数flag的问题. spannab ...

  9. GIT远程仓库地址变更

    将VS2013的解决方案添加到GIT源代码管理后会增加.gitattributes和.gitignore 2个文件以及.git目录 设置远程地址的文件在.git目录下的config文件中 直接修改上图 ...

  10. RSA加密

    1.RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密? 答:公钥加密私钥可解,私钥加密公钥可解. 2.RSA非对称加密特点? 答:算法强度复杂.加密解密速度比对称加密解密的速度慢.一个公钥,对外开 ...