F. Elongated Matrix

题目链接:https://codeforces.com/contest/1102/problem/F

题意:

给出一个n*m的矩阵,现在可以随意交换任意的两行,最后从上到下,从左到右形成一个序列s1,s2.....snm,满足对于任意相邻的两个数,它们差的绝对值的最大值为k。

现在问怎么交换行与行,可以使得最后的这个k最大。

题解:

人生中第一道状压dp~其实还是参考了这篇博客:https://blog.csdn.net/CSDNjiangshan/article/details/86239183?tdsourcetag=s_pctim_aiomsg

这篇博客思路已经说得很清楚了,我就说下注意的几点吧:

行和列的下标是从0开始的,这是为了适应二进制操作,结合代码想想就知道了,我一开始就是这里没注意;

还有就是n=1时的特判,代码不能很好地处理这种情况,这时横坐标是0,不是1....

其余的照着思路写就是了。

我还有一个谜之问题,就是我先枚举中间点,比后枚举中间点要慢200.300ms左右,不知道为什么,希望有大佬能帮我解答一下。

代码如下:

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N = , M = 1e4+;
int a[N][M];
int dp[N][N][<<N];
int n,m;
int dis[N][N],dis_next[N][N];
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
for(int j=;j<m;j++)
scanf("%d",&a[i][j]);
memset(dis,INF,sizeof(dis));
memset(dis_next,INF,sizeof(dis_next));
memset(dp,,sizeof(dp));
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(i==j) continue ;
for(int k=;k<m;k++) dis[i][j]=min(dis[i][j],abs(a[i][k]-a[j][k]));
for(int k=;k<m-;k++) dis_next[i][j]=min(dis_next[i][j],abs(a[i][k+]-a[j][k]));
}
}
int ans = ;
if(n==){
ans = INF;
for(int i=;i<m-;i++) ans=min(ans,abs(a[][i]-a[][i+]));
printf("%d",ans);
return ;
}
for(int l=;l<n;l++) dp[l][l][<<l]=INF;
for(int l=;l<(<<n);l++){
for(int i=;i<n;i++){
if((l>>i)&==) continue ;
for(int j=;j<n;j++){
if((l>>j)& || i==j) continue ;
for(int k=;k<n;k++){
if((l>>j)&==) continue ;
int now = l|(<<j);
dp[i][j][now]=max(dp[i][j][now],min(dp[i][k][l],dis[k][j]));
}
}
}
}
int now = (<<n)-;
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(i==j) continue ;
ans=max(ans,min(dp[i][j][now],dis_next[i][j]));
}
}
printf("%d",ans);
return ;
}

最新文章

  1. 基于Entity Framework 6的框架Nido Framework
  2. struts tags
  3. 源码编译安装gcc-5.3.0
  4. CABasicAnimation animationWithKeyPath 一些规定的值
  5. SelectedRows.CurrentRowSelected 和 DeleteItem
  6. js点击事件代理时切换图片如何防抖动
  7. crontab linux
  8. Mysql存在则更新,没有则新增
  9. Hadoop问题:There are 0 datanode(s) running and no node(s) are excluded in this operation.
  10. JSOUP 请求JSON
  11. 前台的url通过 ActionName?var1=xx&amp;var2=yy 的形式传给特定action
  12. 整理收集49条JQuery代码小结
  13. select自定义小三角样式
  14. MFC中的一般经验之谈----OnInitialUpdate
  15. Java网络编程(二)关于Socket的一些个人想法
  16. Linux X86-64 进程内存空间布局
  17. 用javascript编写简单银行取钱存钱流程(函数)
  18. hdu 1848(Fibonacci again and again)(SG博弈)
  19. 8VC Venture Cup 2016 - Final Round C. Package Delivery 优先队列
  20. Algorithms - Bucket sort

热门文章

  1. Python学习笔记:第一天python基础
  2. FPGA算法学习(1) -- Cordic(圆周系统之向量模式)
  3. hadoop jar x.jar 执行过程
  4. 利尔达NB-IOT模块对接移动onenet平台步骤
  5. springmvc基础篇—使用注解方式为前台提供数据
  6. ABP官方文档
  7. EntityFramewrok 使用
  8. 使用CodeBlocks编译64位程序(用的编译器仅仅是windows sdk的)
  9. 软工实践Beta冲刺(2/7)
  10. OpenCV中的按钮问题