1812. [NOIP2014]子矩阵

http://www.cogs.pro/cogs/problem/problem.php?pid=1812

★★★   输入文件:submatrix.in   输出文件:submatrix.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

最暴力的算法是枚举选择哪些行、列。复杂度为O(C(n,r)*C(m,c))。不过显然不能承受。(C为组合数)
注意到虽然O(C(n,r)*C(m,c))不能承受,但O(C(n,r))或O(C(m,c))是可以接受的。
不妨考虑枚举其中一个(假设枚举行)。
枚举完行后,由于行已确定,因此可以把所有行捆绑,视为一个整体。
处理处列与列之间的价值,然后可以用动态规划解决这个问题。
设dp[i][k]表示前i列选了k列,并且第i列强制被选。那么转移方程为:dp[i][k]=dp[j][k-1]+cost[j][i]+val[i],其中j<i,cost[j][i]表示第i列与第j列相邻的花费,val[i]表示第i列内的花费。
答案即为min{dp[i][c]}。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
using namespace std;
int a[][],m,n,r,c,lr[],ud[],dp[][];
int rlc[],udc[][],ans=0x7fffffff;
void Dp(){
memset(rlc,,sizeof(rlc));
memset(udc,,sizeof(udc));
memset(dp,/,sizeof(dp));
//不同列之间的差
for(int i=;i<=m;i++)
for(int j=;j<i;j++)
for(int k=;k<=r;k++)
udc[j][i]+=abs(a[lr[k]][i]-a[lr[k]][j]);
//不同行之间的差
for(int i=;i<=m;i++)
for(int j=;j<r;j++)
rlc[i]+=abs(a[lr[j]][i]-a[lr[j+]][i]);
for(int i=;i<=n;i++)dp[i][]=,dp[i][]=rlc[i];
for(int i=;i<=c;i++){
for(int j=i;j<=m;j++){
for(int k=i-;k<j;k++){
dp[j][i]=min(dp[k][i-]+udc[k][j]+rlc[j],dp[j][i]);
}
}
}
for(int i=c;i<=m;i++)ans=min(ans,dp[i][c]);
}
void dfs(int Step,int rest){
if(Step==r){Dp();return;}
if(r-Step>rest)return;
for(int i=rest;i>=;i--){lr[Step+]=i;dfs(Step+,i-);}
}
int main(){
freopen("submatrix.in","r",stdin);
freopen("submatrix.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&r,&c);
for(int i=;i<=n;i++)for(int j=;j<=m;j++)scanf("%d",&a[i][j]);
dfs(,n);
printf("%d",ans);
}

[NOIP2014]子矩阵的更多相关文章

  1. Luogu 2258 [NOIP2014] 子矩阵

    被普及组虐了,感觉

  2. $NOIp$普及组做题记录

    \([NOIp2014]\) 螺旋矩阵 \(Sol\) 直接模拟,一次走一整行或者一整列.复杂度\(O(n)\). \(Code\) #include<bits/stdc++.h> #de ...

  3. 【NOIP2014】子矩阵

    这题如果按暴力做只有一半分,最大时间复杂度为O(C(16,8)*C(16,8)); 很容易算出超时: 我们可以发现如果直接dp会很难想,但是知道选哪几行去dp就很好写状态转移方程: dp[i][j]= ...

  4. 1768:最大子矩阵(NOIP2014初赛最后一题)

    1768:最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如 ...

  5. NOIP2014 T4 子矩阵 dfs+dp

    最近在狂补题啊QAQ... 打算先把NOIP的干掉吧... 点我看题 链接还是放洛谷的了... 题意:给一个n*m的矩阵,在这个矩阵里选 r 行 c 列,然后这 r 行 c 列所相交的格子为新矩阵的, ...

  6. [NOIP2014普及组]子矩阵

    题目:洛谷P2258.Vijos P1914.codevs 3904. 题目大意:给你一个矩阵,要你找一个r行c列的子矩阵,求最小分值(子矩阵和分值的定义见原题). 解题思路:n和m比较小,考虑暴力. ...

  7. ACM 中 矩阵数据的预处理 && 求子矩阵元素和问题

            我们考虑一个$N\times M$的矩阵数据,若要对矩阵中的部分数据进行读取,比如求某个$a\times b$的子矩阵的元素和,通常我们可以想到$O(ab)$的遍历那个子矩阵,对它的各 ...

  8. [BZOJ1127][POI2008] KUP子矩阵

    Description 给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个n*n的地图 Output 输出矩形的左 ...

  9. 【SCOI2005】 最大子矩阵 BZOJ 1084

    Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

随机推荐

  1. Java for LeetCode 098 Validate Binary Search Tree

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  2. 服务器安装tensorflow导入模块报错Illegal instruction (core dumped)

    在ubuntu上安装tensorflow后导入模块显示Illegal instruction (core dumped) 服务器的版本是Ubuntu 16.04.5 降低版本,成功导入模块 pip3 ...

  3. JAVA源码分析------锁(1)

    http://870604904.iteye.com/blog/2258604 第一次写博客,也就是记录一些自己对于JAVA的一些理解,不足之处,请大家指出,一起探讨. 这篇博文我打算说一下JAVA中 ...

  4. Flash+XML前后按钮超酷焦点图

    在线演示 本地下载

  5. html的head中的常见元素

    <head></head>中有charset, title,link 操作系统默认的字符编码就是gbk. html的加强 (1)<a href="#" ...

  6. openfire开发环境(3.9.1)

    1.解压源码 2.把build/eclipse中的文件cp到源码跟目录,并修改文件名,前面增加"."号,变成eclipse工程. 3.导入eclipse, 把build/lib/, ...

  7. Java_正则_00_资源贴

    二.参考资料 1.揭开正则表达式的神秘面纱

  8. labview初步理解

    1.labview是NI公司开发的一款以图形方式开发程序(G语言)的程序开发环境软件.它的作用与VS一样,是一种程序开发环境.只是vs是以文本语言开发环境而已. 2.labview最广泛应用于开发测试 ...

  9. NO0:重新拾起C语言

    因工作所需,重新捡起C语言,之前在学校里有接触过,但现在已经忘的一干二净了,现决定重新开始学习,为工作,为生活. 以<标准 C程序设计 第5版>的课程进行基础学习,同时以另外两本书为辅助, ...

  10. 解决系统存在大量TIME_WAIT状态的连接

    系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决, vi /etc/sysctl.conf 编辑文件,加入以下内容:net.ipv4.tcp_syncookies = 1net.ipv4 ...