F. Elongated Matrix

题意

给你一个n行m列的矩阵,我们由第一行第一列出发,从上向下走完第一列,之后再从第二行第一列出发,重复这个过程直到所有的格子都走完,我们可以得到一个路径序列,定义k为序列中所有相邻两数值的差的绝对值的最小值,现在我们可以交换矩阵的每一行,问交换之后k最大是多少。

1&lt;=n&lt;=161&lt;=n&lt;=161<=n<=16
1&lt;=m&lt;=1041&lt;=m&lt;=10^41<=m<=104
做法

首先我们想一个暴力一点的做法,如果能枚举所有行的交换情况,那么我们只要算出是否相邻两行满足条件及第一行和最后一行满足条件即可,但是n=16明显不可以,之后我们只枚举第一行和最后一行,并对中间的所有行建边,边权就是能让这两行相邻的最大的k,那么如果我们可以通过这些边从第一行走到最后一行,这条路径上所有边权的最小值就是答案,问题就转换为一个有向图,给定起点终点,求哈密顿回路,我们设dp[i][j][k]为i状态下j为起点k为终点的路径上的最小值,定义vis[i][j][k]为状态i下j为起点是否可以到达k,之后我们就可以类似经典的状压dp做出这道题。
首先,dp的初始状态要把每个点到自己本身联通,也就是

 for(int i=1;i<=n;i++)  vis[1<<(i-1)][i][i]=1;

从小到大枚举所有状态,在每种状态中,枚举所有可能为起点的j,再枚举所有当前状态不包含的点k,对于每个k,再去找每个存在于状态i中的p,设minn[i][j]为i->j连边的最小差的绝对值,那么我们可以得到转移方程

 dp[i+(1<<(k-1))][j][k]=max(dp[i+(1<<(k-1)),dp[i][j][p]+minn[p][k])

最后对所有状态为1<<(n-1)的dp值,求出让首尾合法的k,再取min即可。

坑点
当只有一行的时候需要特判掉。
代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5+5;
int dp[1<<16][17][17];
int vis[1<<16][17][17];
int minn[17][17];
int minn2[17][17];
int pic[17][10005];
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){scanf("%d",&pic[i][j]);}}if(n==1){int ans=INF;for(int i=2;i<=m;i++) ans=min(ans,abs(pic[1][i]-pic[1][i-1]));printf("%d",ans);return 0;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){minn[i][j]=INF;minn2[i][j]=INF;for(int k=1;k<=m;k++){minn[i][j]=min(minn[i][j],abs(pic[i][k]-pic[j][k]));}for(int k=2;k<=m;k++){minn2[i][j]=min(minn2[i][j],abs(pic[i][k]-pic[j][k-1]));}}}for(int i=1;i<=n;i++)vis[1<<(i-1)][i][i]=1;int ans=0;for(int i=1;i<(1<<n);i++){int cnt=0;for(int j=1;j<=n;j++){if(i&(1<<(j-1))){cnt++;}}if(i==(1<<n)-1){for(int j=1;j<=n;j++){for(int k=1;k<=n;k++){if(vis[i][j][k]) ans=max(ans,min(dp[i][j][k],minn2[j][k]));}}}for(int j=1;j<=n;j++){for(int k=1;k<=n;k++){if(vis[i][j][k]==0) continue;for(int p=1;p<=n;p++){if(i&(1<<(p-1))) continue;vis[i+(1<<(p-1))][j][p]=1;if(cnt==1) dp[i+(1<<(p-1))][j][p]=max(dp[i+(1<<(p-1))][j][p],minn[k][p]);else dp[i+(1<<(p-1))][j][p]=max(dp[i+(1<<(p-1))][j][p],min(minn[k][p],dp[i][j][k]));}}}}printf("%d\n",ans);return 0;
}

【Codeforces Round #531 (Div. 3) F. Elongated Matrix】状压DP相关推荐

  1. Codeforces Round #585 (Div. 2)E. Marbles(状压dp)

    https://codeforces.com/contest/1215/problem/E cnt[x][j]表示把x这种颜色全放到j这种颜色前面所需要的交换次数. 其实这题跟上一篇博客那题是同一个套 ...

  2. Codeforces Round #595 (Div. 3) F. Maximum Weight Subset 树形dp

    传送门 文章目录 题意: 思路: 题意: n≤200n\le200n≤200 思路: 明显的树形dpdpdp,所以考虑一下dpdpdp状态. 这个题状态挺神的..可能是因为我太菜了,看了半天才看懂. ...

  3. Codeforces Round #521 (Div. 3): F. Pictures with Kittens(DP+单调队列)

    题意: 你有n幅画,第i幅画的好看程度为ai,再给你两个数字k,x,表示你要从中选出刚好x幅画,并且相邻两幅画的距离不能≥k,好看程度之和最大能多少,选不出来输出-1,F1数据范围<200,F2 ...

  4. Codeforces Round #642 (Div. 3) F. Decreasing Heights 题解(dp+思维)

    题目链接 题目思路 emmm这个题目如果找到一个性质就很好了,就是如果确定a[1][1]的值,那么就一下确定了,而且a[1][1]的值只有n*m个.因为如果最终的合法路径每个格子都被操作了至少一次,那 ...

  5. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

  6. Codeforces Round #644 (Div. 3) F.Spy-string

    Codeforces Round #644 (Div. 3) F.Spy-string 题目链接 You are given n strings a1,a2,-,an: all of them hav ...

  7. Codeforces Round #849 (Div. 4) F. Range Update Point Query

    Codeforces Round #849 (Div. 4) F. Range Update Point Query 题目大意: 给一串数字,有两个操作: 操作1:将 l − r l-r l−r 的数 ...

  8. Codeforces Round #538 (Div. 2) F. Please, another Queries on Array? 线段树 + 欧拉函数

    传送门 文章目录 题意: 思路: 题意: 给你一个序列aaa,你需要实现两种操作: (1)(1)(1) 将[l,r][l,r][l,r]的aia_iai​都乘rrr. (2)(2)(2) 求ϕ(∏i= ...

  9. Codeforces Round #742 (Div. 2) F. One-Four Overload 构造 + 二分图染色

    传送门 文章目录 题意: 思路: 题意: 给你一个n∗mn*mn∗m的矩形,包含...和XXX,你有两种颜色,你需要给...染色使得每个XXX上下左右相邻的...其两种颜色个数相同,输出一种合法方案. ...

  10. Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑最终的序列是什么鸭子的,首先序列肯定单调不降,也就是a1≤a2≤a3≤...≤ana_1\le a_2\le a_3\le ...\le a_na ...

最新文章

  1. 深度学习时代的图模型,清华发文综述图网络
  2. 新版kali安装beef-xss一大堆报错解决办法
  3. ctf镜子里面的世界_帮大爷干活,他送了我一只鞋子和一手套,又不能穿拿来做什么?哈哈哈|叶子|镜子|虫子|鞋子|棺材...
  4. 前端学习(2138):前端工程化
  5. 【LeetCode笔记】1143. 最长公共子序列(Java、动态规划、字符串)
  6. Conversion of Continuous-Valued Deep Networks to Efficient Event-Driven Networks for Image
  7. 阿里的CTR预测(二):Deep Interest Evolution Network
  8. jsp中文乱码问题 个人感觉比较有用
  9. 2.策略模式(Strategy)
  10. 多个pdf怎么合并成一个pdf?如何将几个pdf文件合并成一个pdf?
  11. 各种门锁的内部结构图_防盗门锁锁体内部结构图是什么?
  12. 邱昭良:“碎片化”学习真是“一场骗局”吗?
  13. Proof of Stake - 股权证明 系列1
  14. Markov链n步转移概率的两种解法
  15. VScode 模糊查找替换 正则
  16. 利用o(nlogn)的时间复杂度对某一个区间进行质因数分解
  17. ali arthas 火焰图_手把手教你看懂Chrome火焰图!(调试性能必备)
  18. 毕业设计 - 题目:基于机器视觉的图像矫正 (以车牌识别为例) - 图像畸变校正
  19. 1989-2015各国平均关税水平
  20. Outlook分组后,为什么桌面和收件箱无提示

热门文章

  1. [转]通过路径直接打开时地图时报错的解决方法
  2. Python状况:为什么PyPy是Python的未来?
  3. Java基础(数组)数组缩减
  4. c语言 常量整数,C语言的整型常量
  5. 新装的服务器wincc上一些图形不显示,wincc画面无法全部显示
  6. 活动效果评价模型--原理和实现(基于python)
  7. android字体文件制作教程,Android使用自定义字体
  8. java compile方法_Java Pattern.compile函数的语法以及参数
  9. 线程停止(stop/intrrupt)
  10. WIN10下Apache启动失败