题目链接

题意: 给出一个n*m大小的01矩阵,在其中画线连成封闭图形,其中对每一个值为1的方格,线要恰好穿入穿出共两次,对每一个值为0的方格,所画线不能经过。

参考资料: 《基于连通性状态压缩的动态规划问题》  ——陈丹琦 2008年国家集训队论文

递推过程中,按照 遍历行->遍历行上每一格->遍历 “轮廓线跨过该格时所有可能的状态变化”   的顺序

这样复杂度是 O(n*m*2m+1)  (m+1是因为轮廓线上有m个单元是与列数对应的,另有一单独的竖线单元)

问题关键点在于解决  “轮廓线跨过该格时所有可能的状态变化”

首先是由第i行到第i+1行的递推关系。显然,第i+1行上,轮廓线未跨过任何方格,与在第i行,轮廓线跨过了所有方格,这两者轮廓线的形态是相同的,不过,前者的状态state1应表示为后者的状态state2<<1,在代码中,计数关系通过 for(int k=0;k<M;k++) dp[i][0][k<<1]=dp[i-1][m][k]; 来实现。

然后是在同一行上跨过某一格时的递推关系。不考虑方格值为0,这道题里面共有四种情况,对于具体某一格而言,即 00->11,01->10,10->01,11->00。对于方格值为0的情况,显然只能是00->00。

后继状态总计数=sigma合法的前驱状态。

具体可以借助代码来理解

#include<bits/stdc++.h>
using namespace std;
typedef long long LL; const int maxn=; int n,m;
int mp[maxn][maxn];
LL dp[maxn][maxn][<<maxn]; LL solve()
{
int M=<<(m+); //轮廓线上状态总数
dp[][m][]=;
for(int i=;i<=n;i++) //遍历行
{
for(int k=;k<M;k++)
dp[i][][k<<]=dp[i-][m][k];
for(int j=;j<=m;j++) //j用来指示轮廓线中小竖线的位置
{
int state1=(<<j),state2=(<<(j-));
for(int k=;k<M;k++)
{
if(mp[i][j])
{
if((k&state1)==&&(k&state2)==)
dp[i][j][k]=dp[i][j-][k+state1+state2];
else if((k&state1)!=&&(k&state2)!=)
dp[i][j][k]=dp[i][j-][k-state1-state2];
else if((k&state1)==&&(k&state2)!=)
{
dp[i][j][k]+=dp[i][j-][k-state2+state1];
dp[i][j][k]+=dp[i][j-][k];
}
else
{
dp[i][j][k]+=dp[i][j-][k-state1+state2];
dp[i][j][k]+=dp[i][j-][k];
}
}
else
if((k&state1)==&&(k&state2)==)
dp[i][j][k]=dp[i][j-][k];
}
}
}
return dp[n][m][];
} int main()
{
int T,kase=;
scanf("%d",&T);
while(T--)
{
memset(dp,,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&mp[i][j]);
printf("Case %d: There are %lld ways to eat the trees.\n",++kase,solve());
}
}

最新文章

  1. CGI与FastCGI
  2. jq+css+html简单实现导航下拉菜单
  3. js注入
  4. Codeforces Round #258 D Count Good Substrings --计数
  5. LoC
  6. maven使用之烦人的.lastUpdated文件
  7. python【第九篇】多线程、多进程
  8. 转:你需要知道的NoSQL数据库10件事
  9. 深入理解Arrays.sort() (转)
  10. 编译虚拟机jvm——openjdk的编译
  11. day22 栈 , 队列 , 约束和反射
  12. select top 1 和select top 1 with ties * from SC 的区别
  13. vue组件的通信
  14. Linux学习笔记:Jenkins的使用(二)
  15. Web开发的小知识点
  16. 《python语言程序设计》_第二章笔记
  17. Address already in use: JVM_Bind问题的解决
  18. 查看ElasticSearch服务状态和结果的URL
  19. 『TensotFlow』RNN中文文本_上
  20. codeforce949A(顺带vector详细使用介绍)

热门文章

  1. XML的基础之一(概念和语法)
  2. 【SD系列】SAP SD模块-公司间销售简介
  3. gradle使用方法
  4. springboot启动时报错 错误: 找不到或无法加载主类 com.xxx.xxx.Application
  5. jmeter _Random函数生成随机数
  6. Elasticsearch安装及遇到的问题(CentOS 7.3 64位)
  7. JAVA总结--集合
  8. dp(传球)
  9. 入门级,关于下载设置wamp的安装
  10. 2019牛客暑期多校训练营(第四场) - K - number - dp