这题如果按暴力做只有一半分,最大时间复杂度为O(C(16,8)*C(16,8)); 很容易算出超时;

我们可以发现如果直接dp会很难想,但是知道选哪几行去dp就很好写状态转移方程:

dp[i][j]=min(dp[i][j],dp[k][j-1]+a[i]+b[k][i]);

其中dp[i][j]表示 前i列里选j列的子矩阵最大分值

a[i]表示 第i列选到的行的总差值

b[k][i]表示选到的每一行第k列和第i列之间的差值

我们只要枚举 行 然后dp一次,取最小值即可 这样最大时间复杂度就成了O(C(8,16)*n3);

最后附上我弱弱的pascal代码:

 var
i,j,k,n,m,n1,m1,ans:longint;
dp,a,f:array[..,..] of longint;
hc:array[..,..,..] of longint;
b,lc:array[..] of longint;
function min(a,b:longint):longint;
begin
if a>b then min:=b
else min:=a;
end;
procedure ddp;
var
i,j,k,max:longint;
begin
fillchar(f,sizeof(f),);
fillchar(lc,sizeof(lc),);
fillchar(dp,sizeof(dp),);
for i:= to m do
for j:= to n1- do
lc[i]:=lc[i]+abs(a[b[j+],i]-a[b[j],i]);
for i:= to m do
for j:=i+ to m do
for k:= to n1 do
f[i,j]:=f[i,j]+hc[b[k],i,j];
for i:= to m do
dp[i,]:=lc[i];
for i:= to m do
for j:= to m1 do
if i>=j then
begin
dp[i,j]:=maxlongint;
for k:=j- to i- do
dp[i,j]:=min(dp[i,j],dp[k,j-]+lc[i]+f[k,i]);
end;
for i:=m1 to m do
if dp[i,m1]<ans then ans:=dp[i,m1];
end;
procedure jw(ii:longint);
begin
inc(b[ii]);
if ii>= then
if b[ii]>(n-n1+ii) then
begin
jw(ii-);
b[ii]:=b[ii-]+;
end;
end;
begin
read(n,m,n1,m1);
for i:= to n do
for j:= to m do
begin
read(a[i,j]);
for k:= to j- do
hc[i,k,j]:=abs(a[i,j]-a[i,k]);
end;
for i:= to n1 do
b[i]:=i;
ans:=;
while b[]= do
begin
ddp;
jw(n1);
end;
write(ans);
end.

【NOIP2014】子矩阵的更多相关文章

  1. [NOIP2014]子矩阵

    1812. [NOIP2014]子矩阵 http://www.cogs.pro/cogs/problem/problem.php?pid=1812 ★★★   输入文件:submatrix.in   ...

  2. Luogu 2258 [NOIP2014] 子矩阵

    被普及组虐了,感觉

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

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

  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. InnoDB关键特性之change buffer

    一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主 ...

  2. python数据可视化(matplotlib)

  3. 五. Java集合概要

    了解了Java内存相关的内容后,现在来简单介绍下Java的集合. Set:不含有重复数据的集合.常用的对象HashSet,TreeSet,LinkedHashSet.HashSet拥有很好的性能,其数 ...

  4. Angularjs跳转切换至对应选项卡

    //跳转前页面 <div class="list user_order" ng-click="userOpen('userOrder',0)"> & ...

  5. java考试易错题大全

    常见的Java问题 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Ja ...

  6. Java中使用POI读取大的Excel文件或者输入流时发生out of memory异常参考解决方案

    注意:此参考解决方案只是针对xlsx格式的excel文件! 背景 前一段时间遇到一种情况,服务器经常宕机,而且没有规律性,查看GC日志发生了out of memory,是堆溢出导致的,分析了一下堆的d ...

  7. [补档][Lydsy2017年4月月赛]抵制克苏恩

    [Lydsy2017年4月月赛]抵制克苏恩 题目 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平. 如果你不玩炉石传说,不必担心,小Q同学会告诉你所有相关的细节.炉石传说是这样的一 ...

  8. vue指令v-cloak示例解析

    v-cloak会隐藏未编译的 Mustache 标签,直至实例准备完毕: [v-cloak] { display: none; } <div v-cloak> {{ message }} ...

  9. 资金平台交易明细扩展开发-DEP

    前言 支持农垦项目中,需要增加抓取银行接口传输数据,需求有两点:一是银企平台前置机需要增加扩展中行.农行数据字段.(代理账号.代理账户名称.代理银行) 二是EAS资金模块中的交易明细查询列表界面能够显 ...

  10. Java微信公众平台开发之扫码支付模式一

    官方文档点击查看准备工作:已通过微信认证的公众号,必须通过ICP备案域名(否则会报支付失败)借鉴了很多大神的文章,在此先谢过了大体过程:先扫码(还没有确定实际要支付的金额),这个码是商品的二维码,再生 ...