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