1273-宣传墙(状压dp )
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 )相关推荐
- 第九届河南省赛 宣传墙 //状压dp+矩阵快速幂+dfs
http://nyoj.top/problem/1273 状压dp+矩阵快速幂+dfs 1273-宣传墙 内存限制:64MB 时间限制:1000ms 特判: No 通过数:19 提交数:64 难度:4 ...
- nyoj1273 河南省第九届省赛_宣传墙、状压DP+矩阵幂加速
宣传墙 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 ALPHA 小镇风景美丽,道路整齐,干净,到此旅游的游客特别多.CBA 镇长准备在一条道路南 面 4*N 的墙上做 ...
- [转]状态压缩dp(状压dp)
状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的 ...
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...
- codeforces 8C. Looking for Order 状压dp
题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...
- UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)
整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...
- POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)
poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...
- 【每日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 ...
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
- 【洛谷 P1896】[SCOI2005]互不侵犯(状压dp)
题目链接 题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 这是道状压\(DP\)好题啊.. ...
最新文章
- 机器学习前沿:Michael Jordan与鬲融、金驰、马腾宇等青年才俊的对话
- android textview改变部分文字的颜色和string.xml中文字的替换及部分内容设置颜色、字体、超链接、图片...
- matlab整定串级pid,PID算法在Matlab串级控制中的应用
- 玲珑杯 ACM Round #10
- Android --- 控件属性的属性值为 @null
- Eureka客户端使用IP注册preferIpAddress和ip-address的区别
- php对话框制作,js制作一个简单的对话框教程
- 使用noConclict后仍然能够在函数体内继续使用$的方法
- C语言为何到现在都是热门语言?原因很简单,程序员大牛都知道
- java反编译工具_安卓逆向之反编译工具的使用
- 轴承配合公差表查询_如何选择轴承公差和配合,才能更好保证电机轴承系统的运行?...
- timestamp ---自动更新修改时间 与 记录首次插入时间
- 六石管理学:好大喜功,头目们是否相信
- linux batchUtil批量运维工具
- 轻量化网络ShuffleNet MobileNet v1/v2 解析
- Mysql 横向数据表变纵向数据表
- 阿里区块链“新路线” |链捕手
- 动圈耳机振膜_小白大讲堂: 耳机振膜材料对音质的影响
- 使用Sharding-Proxy完成mysql分库分表和主从复制
- 不定积分知识结构图_大一上学期《高等数学》知识整理-第四章 不定积分