【NOIP2014】子矩阵
这题如果按暴力做只有一半分,最大时间复杂度为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】子矩阵的更多相关文章
- [NOIP2014]子矩阵
1812. [NOIP2014]子矩阵 http://www.cogs.pro/cogs/problem/problem.php?pid=1812 ★★★ 输入文件:submatrix.in ...
- Luogu 2258 [NOIP2014] 子矩阵
被普及组虐了,感觉
- $NOIp$普及组做题记录
\([NOIp2014]\) 螺旋矩阵 \(Sol\) 直接模拟,一次走一整行或者一整列.复杂度\(O(n)\). \(Code\) #include<bits/stdc++.h> #de ...
- 1768:最大子矩阵(NOIP2014初赛最后一题)
1768:最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如 ...
- NOIP2014 T4 子矩阵 dfs+dp
最近在狂补题啊QAQ... 打算先把NOIP的干掉吧... 点我看题 链接还是放洛谷的了... 题意:给一个n*m的矩阵,在这个矩阵里选 r 行 c 列,然后这 r 行 c 列所相交的格子为新矩阵的, ...
- [NOIP2014普及组]子矩阵
题目:洛谷P2258.Vijos P1914.codevs 3904. 题目大意:给你一个矩阵,要你找一个r行c列的子矩阵,求最小分值(子矩阵和分值的定义见原题). 解题思路:n和m比较小,考虑暴力. ...
- ACM 中 矩阵数据的预处理 && 求子矩阵元素和问题
我们考虑一个$N\times M$的矩阵数据,若要对矩阵中的部分数据进行读取,比如求某个$a\times b$的子矩阵的元素和,通常我们可以想到$O(ab)$的遍历那个子矩阵,对它的各 ...
- [BZOJ1127][POI2008] KUP子矩阵
Description 给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个n*n的地图 Output 输出矩形的左 ...
- 【SCOI2005】 最大子矩阵 BZOJ 1084
Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
随机推荐
- ARM开发(2)基于STM32的蜂鸣器
基于STM32的蜂鸣器 一 蜂鸣器原理: 1.1 本实验实现1个蜂鸣器间隔1S鸣叫. 1.2 实验思路:根据电路图原理,给蜂鸣器相关引脚赋予高低电平,实现电路的导通,使蜂鸣器实现鸣叫或不鸣. 1 ...
- WMvare桥接模式固定IP
一.命令行固定IP 1.配置网卡IP地址 在命令行输入"vi /etc/sysconfig/network-scripts/ifcfg-eth0"#eth0为第一块网卡,如果是第二 ...
- ASP.NET MVC5 使用MiniProfiler 监控MVC性能
MiniProfiler ,一个简单而有效的迷你剖析器,可以有效的实时监控页面.通过直接引用.Ajax.Iframe形式访问的其它页面进行监控,监控内容包括数据库内容,并可以显示数据库访问的SQL. ...
- Spring Ioc-依赖注入的几种方式
一 setter方法注入 配置文件如下: <bean id="helloAction" class="org.yoo.action.SpringSetterHell ...
- mongodb中limit与skip方法
Mongodb Limit()方法 如果需要在mongodb中获取指定数量的数据记录,这时候就要用到limit()方法,该方法需要接收一个数字参数 基本语法: DB.COLLECTION_NAME. ...
- 一次花费了一两个小时的mysql问题排查
晚上把博客迁了个服务器,新建用户的时候遇到问题了. 关于mysql的问题. 前置操作 建了两个用户,一个laravel,一个blog用户以及他们的同名数据库. 建好之后,命令行下面连接mysql服务, ...
- 浅谈js中如何动态添加表头/表列/表格内容
我想很多童鞋用js动态向表格中添加数据很熟悉,而且也觉得非常简单!是的,对于写页面的童鞋来说,最喜欢写查询的页面了,动态向表格绑定数据.用for循环就可以轻松搞定. 如果我们的业务需求有所变化,可能我 ...
- python-冒泡排序,升序、降序
冒泡排序 这个算法的名字由来是因为越大的元素会经交换慢慢浮'到数列的顶端. 冒泡排序的基本思想:重复走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,直到没有再需要交换,完成排序 ...
- Mysql自动填充测试数据
前言 最近写了两个小脚本,一个应用于Mysql的自动填充测试数据,另外一个是bash写的定期删除日志文件,两个脚本如何使用,在GitHub上面都有所说明,这里不再赘述,这里主要是想聊一下Mysql的存 ...
- vc操作电脑之常用命令
1.重启计算机: ExitWindowsEx(EWX_REBOOT,0); 2.关机: ExitWindowsEx(EWX_SHUTDOWN,0); 3.注销: ExitWindowsEx(EWX_L ...