hdu1693 Eat the Trees

题意

在\(n*m\)的矩阵中,有些格子有树,没有树的格子不能到达,找一条或多条回路,吃完所有的树,求有多少种方法。

解法

这是一道插头dp的入门题,只需要考虑插头的有无,不需要维护连通性,很愉快。

代码

#include <cstring>
#include <cstdio>
#include <cstdlib>
#define del(a,b) memset(a,sizeof(a),b)
using namespace std;
typedef long long ll; int G[13][13];
ll dp[13][13][1<<12];
int n,m; void DP() {
dp[0][m][0]=1;
for(int i=1;i<=n;i++) { for(int j=0;j<(1<<m);j++)
dp[i][0][(j<<1)]=dp[i-1][m][j]; for(int j=1;j<=m;j++) {
for(int k=0;k<(1<<(m+1));k++) {
int up=1<<j;
int lef=1<<(j-1); if(G[i][j]) {
if((k&up)&&(k&lef))
dp[i][j][k]=dp[i][j-1][k^up^lef];
else if(!(k&up)&&!(k&lef))
dp[i][j][k]=dp[i][j-1][k|up|lef];
else dp[i][j][k]=dp[i][j-1][k^up^lef]+dp[i][j-1][k];
}
else {
if(!(k&up)&&!(k&lef))
dp[i][j][k]=dp[i][j-1][k];
else dp[i][j][k]=0;
}
}
}
} } int main() {
int t;
scanf("%d",&t);
for(int k=1;k<=t;k++) {
del(G,0);
del(dp,0);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&G[i][j]);
DP();
printf("Case %d: There are %lld ways to eat the trees.\n",k,dp[n][m][0]);
}
return 0;
}

最新文章

  1. 重置VS设置
  2. JavaScript笔记 Function
  3. CRM Diagnostics CRM 2016 诊断
  4. 【初探Underscore】再说模版引擎
  5. 在CentOS上搭建apache和PHP服务器环境(转)
  6. HTML几类标签的应用总结
  7. 从奥鹏一个答案提取页面 看jquery知识点
  8. 区分width()、css(&#39;width&#39;)、innerWidth()
  9. JMeter分布式性能测试
  10. JS的MD5加密
  11. 【数据下载】利用wget命令批量下载ftp文件和文件夹
  12. phpstudy 配置端口 和 虚拟域名访问
  13. Python写一个京东抢券脚本
  14. spring-boot-2.0.3应用篇 - shiro集成
  15. jquery banner 轮播配置方法
  16. SDN 第四次作业
  17. mysql基础(二)—— 简单sql
  18. ASP.NET MVC 3 常用
  19. shell source命令说明
  20. Vue axios 上传图片

热门文章

  1. 代码检查工具sonarqube介绍及使用
  2. vue 面试题 2019
  3. ansible --help 文档
  4. strtotime的一个使用问题
  5. 使用postman 测试restful接口
  6. [jQuery]ajax同步请求在方法内问题
  7. Linux内核project导论——网络:Netfilter概览
  8. 每天自己主动备份mysql脚本
  9. angularjs1-1
  10. page template in kentico