【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代码:
1 var 2 i,j,k,n,m,n1,m1,ans:longint; 3 dp,a,f:array[0..16,0..16] of longint; 4 hc:array[0..16,1..16,1..16] of longint; 5 b,lc:array[0..17] of longint; 6 function min(a,b:longint):longint; 7 begin 8 if a>b then min:=b 9 else min:=a; 10 end; 11 procedure ddp; 12 var 13 i,j,k,max:longint; 14 begin 15 fillchar(f,sizeof(f),0); 16 fillchar(lc,sizeof(lc),0); 17 fillchar(dp,sizeof(dp),0); 18 for i:=1 to m do 19 for j:=1 to n1-1 do 20 lc[i]:=lc[i]+abs(a[b[j+1],i]-a[b[j],i]); 21 for i:=1 to m do 22 for j:=i+1 to m do 23 for k:=1 to n1 do 24 f[i,j]:=f[i,j]+hc[b[k],i,j]; 25 for i:=1 to m do 26 dp[i,1]:=lc[i]; 27 for i:=2 to m do 28 for j:=2 to m1 do 29 if i>=j then 30 begin 31 dp[i,j]:=maxlongint; 32 for k:=j-1 to i-1 do 33 dp[i,j]:=min(dp[i,j],dp[k,j-1]+lc[i]+f[k,i]); 34 end; 35 for i:=m1 to m do 36 if dp[i,m1]<ans then ans:=dp[i,m1]; 37 end; 38 procedure jw(ii:longint); 39 begin 40 inc(b[ii]); 41 if ii>=0 then 42 if b[ii]>(n-n1+ii) then 43 begin 44 jw(ii-1); 45 b[ii]:=b[ii-1]+1; 46 end; 47 end; 48 begin 49 read(n,m,n1,m1); 50 for i:=1 to n do 51 for j:=1 to m do 52 begin 53 read(a[i,j]); 54 for k:=1 to j-1 do 55 hc[i,k,j]:=abs(a[i,j]-a[i,k]); 56 end; 57 for i:=1 to n1 do 58 b[i]:=i; 59 ans:=100000000; 60 while b[0]=0 do 61 begin 62 ddp; 63 jw(n1); 64 end; 65 write(ans); 66 end.
转载于:https://www.cnblogs.com/WQHui/p/5869500.html
【NOIP2014】子矩阵相关推荐
- 【vijos P1914】【codevs 3904】[NOIP2014 普及组T4]子矩阵(dfs+状压dp)
P1914子矩阵 Accepted 标签:NOIP普及组2014[显示标签] 描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与 列的相对顺序)被称为原矩阵 ...
- 子矩阵(NOIP2014 普及组第四题)
描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与 列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第 2.4 行和第 2.4.5 列交叉位置 ...
- 【NOIP2014普及组】子矩阵
题目 题目描述 给出如下定义: 1. 子矩阵: 从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序) 被称为原矩阵的一个子矩阵. 例如,下面左图中选取第 ...
- 题解:子矩阵(NOIP2014普及组T4)
又是dp 暴力枚举会T 考虑先固定一个变量,比如先枚举行 然后预处理每行之间的绝对值,每列之间的绝对值 然后dp进行转移 注意记录选择的行数 转移记得加上新选的列的行之间的绝对值,即w[i], 1 # ...
- 求一个矩阵的最大子矩阵
#include <iostream> #include <string> #include <assert.h> #include <malloc.h> ...
- 最大子矩阵(降维处理)
题目描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 0 9 2 -6 2 -4 1 - ...
- 带限制条件的最大子矩阵 - 牛客
链接:https://www.nowcoder.com/acm/contest/131/B 来源:牛客网 题目描述 矩阵 M 包含 R 行 C 列,第 i 行第 j 列的值为 Mi,j. 请寻找一个子 ...
- 软件工程——求二维数组所有子矩阵的和的最大值
题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为 ...
- 子矩阵(暴搜(全排列)+DP)
子矩阵(暴搜(全排列)+DP) 一.题目 子矩阵 时间限制: 1 Sec 内存限制: 128 MB 提交: 1 解决: 1 [提交][状态][讨论版] 题目描述 给出如下定义: 1. 子矩阵:从一 ...
最新文章
- 一位铁粉的分享:阿里面试归来总结面经,已成功斩获P6 offer...
- SpringCloud Zuul(八)之ERROR Filter
- libreoffice_利用Excel或LibreOffice的业务输入进行单元测试约束
- anaconda激活python_Anaconda使用conda activate激活环境出错(待完全解决)2018-06-09
- D3 scaleThreshold
- Win11未安装Defender怎么办?解决Win11未安装Defender的方法
- 第一章节 ASP.NET Web应用程序基础(二)
- pythonweb项目源码下载_最新Python WEB开发在线教育项目之谷粒教育 软件源码齐全...
- 开源容器云openshift pdf_OpenShift和Kubernetes的10个最重要的区别
- 通过JAVA获取优酷、土豆、酷6、6间房、56视频
- 计算机自动获取ip地址的协议,自动获取ip地址_计算机是如何自动获取的IP地址的...
- MATLAB深度学习代码详细分析(一)__nnff.m
- spring security——学习笔记(day05)-实现自定义 AuthenticationProvider身份认证-手机号码认证登录
- android现状及发展趋势,2021年Android手机现状分析
- 关于结构化、半结构化、非结构化数据的理解
- HTML5期末大作业:动漫网站设计——迪斯尼公主(6个页面) HTML+CSS+JavaScript 动漫网页HTML代码 学生网页课程设计期末作业下载 动漫大学生网页设计制作成
- Flutter 笔记 | Flutter 布局组件
- MATLAB,关于SOLVE函数报错的问题
- Type 3字体的解决办法
- [附源码]java毕业设计毕业生离校管理系统
热门文章
- NOI2006 最大获利
- 姜黄的毒副作用调研汇总(调研手稿二)
- 2020Alibaba数学竞赛决赛试题
- 修改octave的editor的背景颜色
- pyspark读取json文件中的内容
- 机器学习(三十七)——Integrating Learning and Planning(3)
- 深度学习(十五)——SPPNet, Fast R-CNN
- python3类与对象汽车,Python3 类与对象
- 电脑怎么打印文件步骤_电脑中毒后怎么办 电脑中毒后解决方法【详细步骤】...
- c语言extern关键字详解