1273-宣传墙

内存限制:64MB  时间限制:1000ms  特判: No

通过数:14  提交数:50  难度:4

题目描述:

ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多。CBA 镇长准备在一条道路南 面 4*N 的墙上做一系列的宣传。为了统一规划,CBA 镇长要求每个宣传栏只能占相邻的两个方格 位置。但这条道路被另一条道路分割成左右两段。CBA 镇长想知道,若每个位置都贴上宣传栏, 左右两段各有有多少种不同的张贴方案。 例如: N=6,M=3, K=2, 左,右边各有 5 种不同的张贴方案


输入描述:

第一行: T 表示以下有 T 组测试数据 ( 1≤T ≤8 )
接下来有T行, 每行三个正整数 N M K 分别表示道路的长度,另一条道路的起点和宽度
(1≤ N ,M ≤ 1 000 000, 1≤ K ≤ 100000)

输出描述:

每组测试数据,输出占一行:两个整数,分别表示左右两段不同的张贴方案数。由于方案总数
可能很大,请输出对 997 取模后的结果。

样例输入:

复制

2
6 3 2
5 3 2

样例输出:

5 5
5 1

AC:代码 0ms

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;typedef long long ll;
typedef long long int lli;
typedef unsigned long long llu;const int maxn = 1<<4;
const int mod = 997;
struct matrix{int s[maxn][maxn];
}x;
int n,m,k;
int s1,s2;matrix MulMatrix(matrix a,matrix b,int c,int d,int e)
{matrix res;for(int i = 0;i<c;i++){for(int j = 0;j<d;j++){int x = 0;for(int k = 0;k<e;k++){x = (x + a.s[i][k] * b.s[k][j])%mod;}res.s[i][j] = x;}}return res;
}matrix MatrixPow(matrix a,int b)
{matrix res;memset(res.s,0,sizeof(res.s));for(int i = 0;i<maxn;i++){res.s[i][i] = 1;}while(b){if(b&1) res = MulMatrix(res,a,1,maxn,maxn);b >>= 1;a = MulMatrix(a,a,maxn,maxn,maxn);}return res;
}void dfs(int i,int j,int k,int u)//i 行 j 这一列的状态 k 下一列 u (ii)
{if(u == 4){x.s[i][k] ++;return;}if((j&(1<<u))){dfs(i,j,k,u+1);return;}dfs(i,j|(1<<u),k|(1<<u),u+1);if(u+1<4 && !(j&(1<<u)) && !(j&(1<<(u+1)))){dfs(i,j|(1<<u)|(1<<(u+1)),k,u+2);}
}int main()
{int t;scanf("%d",&t);while(t--){scanf("%d %d %d",&n,&m,&k);int s1 = m-1;if(s1 == 0){printf("0 ");} else {memset(x.s,0,sizeof(x.s));for(int i = 0;i<maxn;i++){dfs(i,i,0,0);}matrix y = MatrixPow(x,s1);printf("%d ",y.s[0][0]%mod);}s2 = n - s1 - k;if(s2 == 0){printf("0\n");} else {memset(x.s,0,sizeof(x.s));for(int i = 0;i<maxn;i++){dfs(i,i,0,0);}matrix y = MatrixPow(x,s2);printf("%d\n",y.s[0][0]%mod);}}return 0;
}

在网上找到了一种简单一点的代码贴一下

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
const int col = 4;
int row;
int dp[900000][1<<4];
void dfs(int r,int c,int pre,int now)
{  if(c==col)  {  dp[r][now] += dp[r-1][pre];  dp[r][now] %= 997;  return ;  }  if(c+1<=col)  {  dfs(r,c+1,pre<<1,(now<<1)|1);  dfs(r,c+1,(pre<<1)|1 ,now<<1);  }  if(c+2<=col)  {  dfs(r,c+2,(pre<<2)|3,(now<<2)|3);  }
}
int main()
{  int T,N,M,K;  scanf("%d",&T);  while(T--)  {  scanf("%d%d%d",&N,&M,&K);  row = M - 1;  if(row<=0)  {  printf("0 ");  }  else  {  memset(dp,0,sizeof(dp));  dp[0][(1<<col)-1] = 1;  for(int i=1;i<=row;i++)  {  dfs(i,0,0,0);  }  printf("%d ",dp[row][(1<<col)-1]);  }  row = N - M - K + 1;  if(row<=0)  {  printf("0\n");  }  else  {  memset(dp,0,sizeof(dp));  dp[0][(1<<col)-1] = 1;  for(int i=1;i<=row;i++)  {  dfs(i,0,0,0);  }  printf("%d\n",dp[row][(1<<col)-1]);  }  }  return 0;
}

1273-宣传墙(状压dp )相关推荐

  1. 第九届河南省赛 宣传墙 //状压dp+矩阵快速幂+dfs

    http://nyoj.top/problem/1273 状压dp+矩阵快速幂+dfs 1273-宣传墙 内存限制:64MB 时间限制:1000ms 特判: No 通过数:19 提交数:64 难度:4 ...

  2. nyoj1273 河南省第九届省赛_宣传墙、状压DP+矩阵幂加速

    宣传墙 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...

  3. [转]状态压缩dp(状压dp)

    状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的 ...

  4. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  5. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  6. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  7. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  8. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  9. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  10. 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)

    题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...

最新文章

  1. 机器学习前沿:Michael Jordan与鬲融、金驰、马腾宇等青年才俊的对话
  2. android textview改变部分文字的颜色和string.xml中文字的替换及部分内容设置颜色、字体、超链接、图片...
  3. matlab整定串级pid,PID算法在Matlab串级控制中的应用
  4. 玲珑杯 ACM Round #10
  5. Android --- 控件属性的属性值为 @null
  6. Eureka客户端使用IP注册preferIpAddress和ip-address的区别
  7. php对话框制作,js制作一个简单的对话框教程
  8. 使用noConclict后仍然能够在函数体内继续使用$的方法
  9. C语言为何到现在都是热门语言?原因很简单,程序员大牛都知道
  10. java反编译工具_安卓逆向之反编译工具的使用
  11. 轴承配合公差表查询_如何选择轴承公差和配合,才能更好保证电机轴承系统的运行?...
  12. timestamp ---自动更新修改时间 与 记录首次插入时间
  13. 六石管理学:好大喜功,头目们是否相信
  14. linux batchUtil批量运维工具
  15. 轻量化网络ShuffleNet MobileNet v1/v2 解析
  16. Mysql 横向数据表变纵向数据表
  17. 阿里区块链“新路线” |链捕手
  18. 动圈耳机振膜_小白大讲堂: 耳机振膜材料对音质的影响
  19. 使用Sharding-Proxy完成mysql分库分表和主从复制
  20. 不定积分知识结构图_大一上学期《高等数学》知识整理-第四章 不定积分

热门文章

  1. HTML中的长度单位px、em、rem
  2. 图解Linux命令之--hwclock命令
  3. 服务器保存时提示文档未保存,Word文档保存时常遇到的问题及其解决方法
  4. 文件被认为是病毒并删除解决办法
  5. Word 实用技巧整理
  6. git无法push大文件:this exceeds GitHub‘s file size limit of 100.00 MB
  7. 算法训练 瓷砖铺放 【递归】java
  8. caxa图文档服务器未启动,CAXA协同管理图文档
  9. 九度OJ—题目1015:还是A+B
  10. 微计算机应用是核心吗,北大核心哪个杂志好投