BZOJ #2669 \ CQOI 2012 局部最小值

题目描述:

在一个N * M的矩阵中填入1 ~ N * M的数,并限制一些位置为周围9个格中最小的,而其它位置不能满足这个条件。

解题思路:

考虑dp,F[i][s]表示填了前i个数,限制位置的填数状态为s,cnt[s]表示限制位置的状态为s时,可以填数的位置+限制位置已填数的数量。

那么 F[i][s] = F[i - 1][s] * (cnt[s] - i + 1) + ∑p∈s F[i - 1][s - p]。

但这样会忽略一些非限制的点满足了限制条件的情况。那我们就dfs把一些非限制点当作限制点,用上面dp做,再容斥掉。

代码:

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 using namespace std;
  5
  6 const int mo = 12345678, fx[8][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
  7 int T, n, m, tot, cnt[1 << 8], f[30][1 << 8], S, mar[10][10], ans;
  8 char s[10][10];
  9
 10 void init() {
 11     tot = 0;
 12     for (int i = 1; i <= n; i ++)
 13         for (int j = 1; j <= m; j ++) if (s[i][j] == ‘X‘) {
 14             tot ++;
 15             mar[i][j] = tot;
 16         } else mar[i][j] = 0;
 17     S = (1 << tot) - 1;
 18     for (int s = 0; s <= S; s ++) {
 19         int t = 0;
 20         for (int i = 1; i <= n; i ++)
 21             for (int j = 1; j <= m; j ++) {
 22                 if (mar[i][j] && ((1 << mar[i][j] - 1) & s)) t ++;
 23                 if (!mar[i][j]) {
 24                     int p = 0;
 25                     for (int k = 0; k < 8; k ++) {
 26                         int ni = i + fx[k][0], nj = j + fx[k][1];
 27                         if (ni < 1 || ni > n || nj < 1 || nj > m) continue;
 28                         if (mar[ni][nj] && (!((1 << mar[ni][nj] - 1) & s))) {
 29                             p = 1;
 30                             break;
 31                         }
 32                     }
 33                     if (!p) t ++;
 34                 }
 35             }
 36         cnt[s] = t;
 37     }
 38 }
 39
 40 int dp() {
 41     for (int i = 1; i <= n * m; i ++)
 42         for (int s = 0; s <= S; s ++) {
 43             (f[i][s] = f[i - 1][s] * (cnt[s] - i + 1)) %= mo;
 44             for (int p = 1; p <= tot; p ++) if ((1 << p - 1) & s) {
 45                 (f[i][s] += f[i - 1][s ^ (1 << p - 1)]) %= mo;
 46             }
 47         }
 48     return f[n * m][S];
 49 }
 50
 51 void dfs(int x, int y, int sum) {
 52     if (y == m + 1) {
 53         dfs(x + 1, 1, sum);
 54         return;
 55     }
 56     if (x == n + 1) {
 57         init();
 58         (ans += dp() * (sum & 1 ? -1 : 1) + mo) %= mo;
 59         return;
 60     }
 61     dfs(x, y + 1, sum);
 62     int p = 0;
 63     for (int k = 0; k < 8; k ++) {
 64         int nx = x + fx[k][0], ny = y + fx[k][1];
 65         if (nx < 1 || nx > n || ny < 1 || ny > m) continue;
 66         if (s[nx][ny] == ‘X‘) {
 67             p = 1;
 68             break;
 69         }
 70     }
 71     if (s[x][y] == ‘X‘) return;
 72     if (!p) {
 73         s[x][y] = ‘X‘;
 74         dfs(x, y + 1, sum + 1);
 75         s[x][y] = ‘.‘;
 76     }
 77 }
 78
 79 int cheak() {
 80     for (int i = 1; i <= n; i ++)
 81         for (int j = 1; j <= m; j ++) if (s[i][j] == ‘X‘)
 82             for (int k = 0; k < 8; k ++) {
 83                 int ni = i + fx[k][0], nj = j + fx[k][1];
 84                 if (ni < 1 || ni > n || nj < 1 || nj > m) continue;
 85                 if (s[ni][nj] == ‘X‘) return 0;
 86             }
 87     return 1;
 88 }
 89
 90 int main() {
 91     scanf("%d", &T);
 92     f[0][0] = 1;
 93     while (T --) {
 94         ans = 0;
 95         scanf("%d %d", &n, &m);
 96         for (int i = 1; i <= n; i ++) scanf("%s", s[i] + 1);
 97         if (!cheak()) {
 98             printf("0\n");
 99             continue;
100         }
101         dfs(1, 1, 0);
102         printf("%d\n", ans);
103     }
104     return 0;
105 }
时间: 2024-07-30 13:37:57

BZOJ #2669 \ CQOI 2012 局部最小值的相关文章

关于过拟合、局部最小值、以及Poor Generalization的思考

Poor Generalization 这可能是实际中遇到的最多问题. 比如FC网络为什么效果比CNN差那么多啊,是不是陷入局部最小值啊?是不是过拟合啊?是不是欠拟合啊? 在操场跑步的时候,又从SVM角度思考了一下,我认为Poor Generalization属于过拟合范畴. 与我的论文 [深度神经网络在面部情感分析系统中的应用与改良] 的观点一致. SVM ImageNet 2012上出现了一个经典虐杀场景.见[知乎专栏] 里面有一段这么说道: 当时,大多数的研究小组还都在用传统compute

●BZOJ 2669 [cqoi2012]局部极小值

题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2669 题解: 容斥,DP,DFS 先看看 dp 部分:首先呢,X的个数不会超过 8个.个数很少,所以考虑状压,把需要填 X的那几个位置状压为二进制10表示对应的那个X位置是否已经填数.同时填的数互不重复,考虑从小填到大. 令 cnt[S] 表示除了不在集合 S 里的 X 位置及其周围的位置,剩下的位置个数. 定义 dp[i][S]表示从小到大填数填完了i这个数,且已经填了的 S 这个集合里

BZOJ 2669 cqoi2012 局部极小值 状压DP+容斥原理

题目大意:给定一个n?m的矩阵,标记出其中的局部极小值,要求填入1...n?m,求方案数 <多年的心头大恨终于切掉了系列> 考虑将数字从小到大一个一个填进去 由于局部极小值最多8个,我们可以状压DP 令fi,j表示已经填完了前i个数,局部极小值的填充状态为j的方案数 预处理出cntj表示填充状态为j时共有多少位置是可以填充的(包括已填充的局部极小值位置) 那么有DP方程fi,j=fi?1,j?C1cntj?i+1+∑k∈jfi?1,j?{k} 但是问题是这样虽然保证了标记的位置都是局部最小值,

【noip模拟】局部最小值

TimeLimit: 1000ms               MemoryLimit: 256MB Description 有一个n行m列的整数矩阵,其中1到n×m之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点)都小,我们说这个格子是局部极小值. 给出所有局部极小值的位置,你的任务是判断有多少个可能的矩阵. Input 输入第一行包含两个整数n和m(1<=n<=4, 1<=m<=7),即行数和列数.以下n行每行m个字符,其中“X”表示局部极小值

[nowCoder] 局部最小值位置

定义局部最小的概念.arr长度为1时,arr[0]是局部最小.arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小:如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小:如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小.给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可. 分析:

局部最小值位置

定义局部最小的概念.arr长度为1时,arr[0]是局部最小.arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小:如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小:如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小.给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可. 分析:

BZOJ 3932 CQOI 2015 任务查询系统 可持久化线段树

题目大意 给出一些任务开始的时间,结束的时间,和优先级.问在第k秒时的第k大优先级,和前k小优先级的和. 思路 CQOI太良心,所有题都是512M. 这个题只需要按照时间轴弄一个可持久化线段树就行了,每个时间点对应着一个权值线段树,维护子节点的和和个数. 注意在没有操作的时候,当前时间点的线段树要复制上一个时间点的线段树. CODE #define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstring> #inclu

bzoj 1818 [CQOI 2010] 内部白点 - 扫描线 - 树状数组

题目传送门 快速的列车 慢速的列车 题目大意 一个无限大的方格图内有$n$个黑点.问有多少个位置上下左右至少有一个黑点或本来是黑点. 扫描线是显然的. 考虑一下横着的线段,取它两个端点,横坐标小的地方放一个+1,大的地方放一个-1事件. 然后扫描,扫到的横着的线段更新,竖着的线段用树状数组求答案. 然后考虑这一列上原来存在的黑点有没有被统计,如果没有就加上. Code 1 /** 2 * bzoj 3 * Problem#1818 4 * Accepted 5 * Time: 1824ms 6

bzoj 2753 [SCOI 2012] 滑雪与时间胶囊 - Prim

题目传送门 传送点I 传送点II 题目大意 给定一个有$n$个点$m$条边的图,每个点有一个高度$h_{i}$,能从$u$经过一条边到达$v$,当且仅当存在一条边是$(u, v)$或$(v, u)$,且$h_{u}\geqslant h_{v}$.问1号点能到达的所有点的最小树形图的边权和. 第一问沙雕问题.直接一个搜索水过. 第二问,好像是最小树形图.看着数据范围,嗯,别想朱-刘了. 感觉可以直接Prim.于是愉快地WA了一发.来回顾一下Prim算法的正确性证明 可以不妨设图中所有边的权重都不