首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >cf1102F. Elongated Matrix(状压dp)

cf1102F. Elongated Matrix(状压dp)

作者头像
attack
发布于 2019-01-30 08:22:26
发布于 2019-01-30 08:22:26
49500
代码可运行
举报
运行总次数:0
代码可运行

题意

题目链接

Sol

\(n \leqslant 16\)可以想到状压

我们可以预处理出任意两行之间每列的最小值以及相邻两列的最小值

然后枚举一个起点,\(f[sta][i]\)表示走过了\(sta\)这个集合内的元素,当前在\(i\)点的\(k\)的最大值

转移的时候枚举接下来走哪个位置即可

时间复杂度\(n^3 2^n\)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10, INF = 1e9 + 10, SS = 18;
template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int N, M, Lim, a[SS][MAXN], f[1 << (SS)][SS], Mn[SS][MAXN], L[SS][MAXN];
void Pre() {
    for(int i = 1; i <= N; i++) {
        for(int j = 1; j <= N; j++) {
            Mn[i][j] = INF; L[i][j] = INF;
            for(int k = 1; k <= M; k++) chmin(Mn[i][j], (i == j) ? a[i][k] : abs(a[i][k] - a[j][k]));
            for(int k = 1; k < M; k++) chmin(L[i][j], abs(a[i][k] - a[j][k + 1]));
        }
    }
}
int DP(int bg) {
    memset(f, -1, sizeof(f));
    f[1 << (bg - 1)][bg] = INF;
    for(int sta = 0; sta < Lim; sta++) {
        for(int i = 1; i <= N; i++) {
            if(f[sta][i] == -1) continue;
            for(int j = 1; j <= N; j++) {
                if(sta & (1 << (j - 1))) continue;
                chmax(f[sta | (1 << (j - 1))][j], min(f[sta][i], Mn[i][j]));
            }
        }
    }
    int now = 0;
    for(int i = 1; i <= N; i++) 
        chmax(now, min(f[Lim][i], L[i][bg]));
    return now;
}
int main() {
    N = read(); M = read(); Lim = (1 << N) - 1;
    for(int i = 1; i <= N; i++)
        for(int j = 1; j <= M; j++) a[i][j] = read();
    Pre();
    int ans = 0;
    for(int i = 1; i <= N; i++) 
        chmax(ans, DP(i));
    cout << ans;
    return 0;
}
/*
3 2
85 6
64 71
1 83

4 2
9 9
10 8
5 3
4 3
*/
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
洛谷P4590 [TJOI2018]游园会(状压dp LCS)
\[f[i][j] = max(f[i - 1][j], f[i][j - 1], f[i - 1][j - 1] + (A_i = B_j))\]
attack
2019/03/19
4860
cf580D. Kefa and Dishes(状压dp)
官方题解是$O(2^n n^2)$的,不过我没发现状态之间的联系,就写了一个$O(2^n n^3)$的,不过还是水过去了。
attack
2018/09/17
3380
洛谷P2831 愤怒的小鸟(状压dp)
直接状压dp一下,\(f[sta]\)表示干掉\(sta\)这个集合里面的鸟的最小操作数
attack
2018/11/29
5950
洛谷P3247 [HNOI2016]最小公倍数(分块 带撤销加权并查集)
给出一张带权无向图,每次询问\((u, v)\)之间是否存在一条路径满足\(max(a) = A, max(b) = B\)
attack
2019/03/15
4420
cf1097D. Makoto and a Blackboard(期望dp)
首先考虑当\(n = p^x\),其中\(p\)是质数,显然它的因子只有\(1, p, p^2, \dots p^x\)(最多logn个)
attack
2019/01/30
3710
ZRDay6A. 萌新拆塔(三进制状压dp)
首先,每次打完怪之后吃宝石不一定是最优的,因为有模仿怪的存在,可能你吃完宝石和他打就GG了。。
attack
2018/09/17
4810
ZRDay6A. 萌新拆塔(三进制状压dp)
洛谷P2178 [NOI2015]品酒大会(后缀自动机 线段树)
显然一个串能更新答案的区间是\([len_{fa_{x}} + 1, len_x]\),方案数就相当于是从\(siz_x\)里面选两个,也就是\(\frac{siz_x (siz_x - 1)}{2}\)
attack
2019/03/06
4620
洛谷P4103 [HEOI2014]大工程(虚树 树形dp)
任意两点的路径和可以考虑每条边两边的贡献,\(d[x]\)表示到该节点的所有节点的路径和,转移的时候考虑一下两棵子树的siz就行(画一下图就很清楚了)
attack
2019/03/20
4820
cf1000F. One Occurrence(线段树 set)
首先把询问离线,预处理每个数的\(pre, nxt\),同时线段树维护\(pre\)(下标是\(pre\),值是\(i\)),同时维护一下最大值
attack
2019/01/30
4840
loj#6074. 「2017 山东一轮集训 Day6」子序列(矩阵乘法 dp)
然后发现可以用矩阵优化,可以分别求出前缀积和逆矩阵的前缀积(这题的逆矩阵炒鸡好求)
attack
2019/04/01
5420
SPOJ GSS3 (动态dp)
设\(f[i]\)表示以\(i\)为结尾的最大子段和,\(g[i]\)表示\(1-i\)的最大子段和
attack
2019/03/08
3670
洛谷P4591 [TJOI2018]碱基序列(hash dp)
题意 题目链接 Sol \(f[i][j]\)表示匹配到第\(i\)个串,当前在主串的第\(j\)个位置 转移的时候判断一下是否可行就行了。随便一个能搞字符串匹配的算法都能过 复杂度\(O(|S| K a_i)\) #include<bits/stdc++.h> #define Pair pair<int, int> #define MP(x, y) make_pair(x, y) #define fi first #define se second //#define int long long #d
attack
2019/03/19
4920
ZR国庆Round2解题报告
然后刚T3暴力,刚完还有2h左右。。然后,,这时候我zz的选择去打T2的暴力,然而T2暴力真的不是一般的难写。。
attack
2018/10/08
3310
loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)
质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案
attack
2019/03/04
5130
HDU4336 Card Collector(期望 状压 MinMax容斥)
\(N\)个物品,每次得到第\(i\)个物品的概率为\(p_i\),而且有可能什么也得不到,问期望多少次能收集到全部\(N\)个物品
attack
2019/01/03
5900
洛谷P4027 [NOI2007]货币兑换(dp 斜率优化 cdq 二分)
设\(f[i]\)表示到第\(i\)天所持有软妹币的最大数量,显然答案为\(max_{i = 1}^n f[i]\)
attack
2019/01/03
4090
cf121C. Lucky Permutation(康托展开)
由于阶乘的数量增长非常迅速,而\(k\)又非常小,那么显然最后的序列只有最后几位会发生改变。
attack
2019/01/30
3660
BZOJ3672: [Noi2014]购票(dp 斜率优化 点分治 二分 凸包)
嘿嘿,这道题的点分治不同于一般的点分治。正常的点分治思路大概是先统计过重心的,再递归下去
attack
2019/01/03
4120
HDU4609 3-idiots(生成函数)
但是如果直接算合法的方案的话会出现一点问题。我们在算的时候维护了一个后缀和表示乘起来大于等于这个数的方案。我们要求的方案需要满足i < j < k,但是这样计算可能会出现不合法的情况。
attack
2019/03/19
7230
洛谷P4424 [HNOI/AHOI2018]寻宝游戏(思维题)
那么我们把每一列上的数和他之前的操作符分别拿出来看成一些序列,显然这个序列要满足最后一个\(\mid 1\)要在\(\& 0\)之后
attack
2019/03/06
4420
推荐阅读
相关推荐
洛谷P4590 [TJOI2018]游园会(状压dp LCS)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档