NOIP2014 T4 子矩阵 dfs+dp
最近在狂补题啊QAQ...
打算先把NOIP的干掉吧...
链接还是放洛谷的了...
题意:给一个n*m的矩阵,在这个矩阵里选 r 行 c 列,然后这 r 行 c 列所相交的格子为新矩阵的,设定矩阵的价值为矩阵中相邻(上下左右)的元素的差的绝对值。
求最小的价值。
思路:这题我还很清楚在今年NOIP集训前lz有讲过,但是没听懂啊QAQ...昨天去看了看,想着先打个暴力水分。
因为比赛中暴力分很关键啊...练好暴力很重要。直接先打了一个裸的双重dfs。拿了55分。
当然这都是普通的暴力分。要知道 暴力打的好,捞分没烦恼。所以我就开始想剪枝优化了...加了个简单的普遍优化,就多水到了10分。一个暴力能比别人多10分,差距其实也挺大的了。
然后就是正解了,正解当然是dp不错,但是对于不确定行且不确定列来dp是十分困难的,然后你会发现,其实数据很小啊,能不能保留一个dfs,然后另一个改成dp...
显然这样之后时间复杂度成功满足,而且还确定了行。
所以考虑列就行了。
我萌设 f[i,j] 表示 以 i 结尾,选了 j 列的最优值。
怎么转移? f[i,j]的前驱状态我萌可以在花一重去枚举,即 f[k,j-1] 这样的话方程就出来了。
设num[i] 表示 在已知行的情况下,在第 i 列中 行于行之间的价值。
设cost[i,j] 表示 在已知行的情况下,第 i 列中的每行和第 j 列中的每行的价值。
这样的话方程就是
f[i,j]=min(f[k,j-1]+num[i]+cost[k,i]) (1≤k≤i-1)
然后答案就是枚举每一列,取 ans=min(ans,f[i,c]) (1≤i≤m)
对于每一种行的排列进行这样的dp取最小的ans就是答案。
这题还是很好的,成功涨了姿势,对于多维的时候,可以考虑使用 dfs 降成 一维再进行dp...
当然辣!我是悄悄咪咪看了题解的。
var
i,j,k:longint;
user,num:array[..]of longint;
f,cost,a:array[..,..]of longint;
n,m,r,c:longint;
ans:longint;
function min(a,b:longint):longint;
begin
if a<b then exit(a) else exit(b);
end;
procedure dp;
var i,j,k:longint;
begin
for i:= to m do
begin
num[i]:=;
for j:= to r do
inc(num[i],abs(a[user[j],i]-a[user[j-],i]));
for j:= to i- do
begin
cost[j,i]:=;
for k:= to r do
cost[j,i]:=cost[j,i]+abs(a[user[k],j]-a[user[k],i]);
end;
end;
for i:= to m do
begin
for j:= to c do
f[i,j]:= <<;
f[i,]:=num[i];
end;
for i:= to m do
for j:= to c do
for k:= to i- do
f[i,j]:=min(f[k,j-]+cost[k,i]+num[i],f[i,j]);
for i:= to m do
if ans>f[i,c] then ans:=f[i,c];
end;
procedure dfs(dep,last:longint);
var i:longint;
begin
if dep=r then
begin
dp;
exit;
end;
for i:=last+ to n do
begin
user[dep+]:=i;
dfs(dep+,i);
end;
end;
begin
read(n,m,r,c);
for i:= to n do
for j:= to m do
read(a[i,j]);
ans:= << ;
dfs(,);
writeln(ans);
end.
NOIP2014 T4
NOIP2014 T4 子矩阵 dfs+dp的更多相关文章
- [洛谷P2258][NOIP2014PJ]子矩阵(dfs)(dp)
NOIP 2014普及组 T4(话说一道PJ组的题就把我卡了一个多小时诶) 这道题在我看第一次的时候是没有意识到这是一道DP题的,然后就摁着DFS敲了好长时间,结果敲了一个TLE 这是DP!!! 下面 ...
- dfs+dp思想的结合------hdu1078
首先是题目的意思: 从一个正方形的0,0点开始走,只能横着走,竖着走,最多走k步,下一个点的数一定要比当前这个点的值大,每走一步,就加上下一个点的数据,问数据最大能有多少. 首先遇到这种题目,走来走去 ...
- HDU1978How Many Ways 记忆化dfs+dp
/*记忆化dfs+dp dp[i][j]代表达到这个点的所有路的条数,那么所有到达终点的路的总数就是这dp[1][1]加上所有他所能到达的点的 所有路的总数 */ #include<stdio. ...
- 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof
题目传送门 /* 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 ans = min (ans, max (dp[x][y-i], dp[x-1][i-1]) + ...
- 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty
题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...
- 【cf1111】C. Creative Snap (dfs+dp)
传送门 简单的dfs+dp即可解决.根本不用动态开点 /* * Author: heyuhhh * Created Time: 2019/11/13 10:12:42 */ #include < ...
- NOIP 2014 普及组 T4 子矩阵
[题意] 已知:n,m,r,c,a[i][j] (1 ≤ n ≤ 16, 1 ≤ m ≤ 16,1 ≤ a[i][j] ≤1000,1 ≤ r ≤ n, 1 ≤ c ≤ m) 条件:矩阵的分值定义为每 ...
- P2258 子矩阵——搜索+dp
P2258 子矩阵 二进制枚举套二进制枚举能过多一半的点: 我们只需要优化一下第二个二进制枚举的部分: 首先我们先枚举选哪几行,再预处理我们需要的差值,上下,左右: sum_shang,sum_hen ...
- HDU 1978 记忆化搜索(dfs+dp)
Y - How many ways Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
随机推荐
- HDU1757又是一道矩阵快速幂模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 按照题目的要求构造矩阵 //Author: xiaowuga //矩阵: //a0 a1 a2 ...
- UIAlertAction 改变字体颜色
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:nil pre ...
- /usr/local/nginx/sbin/nginx -s reload 失败原因pid 进程记录和当前不符
[root@a ~]# /usr/local/nginx/sbin/nginx -s reload;nginx: [alert] kill(18834, 1) failed (3: No such p ...
- 新团建立时间 timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
w 不根据当前时间戳更新. `wtime` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
- Spring Data 分页和排序 PagingAndSortingRepository的使用(九)
继承PagingAndSortingRepository 我们可以看到,BlogRepository定义了这样一个方法:Page<Blog> findByDeletedFalse(Page ...
- LeetCode_Compare Version Numbers
题目: Compare two version numbers version1 and version2. If version1 > version2 return 1, if versio ...
- windows中的进程和线程
今天咱们就聊聊windows中的进程和线程 2016-09-30 在讨论windows下的进程和线程时,我们先回顾下通用操作系统的进程和线程.之所以称之为通用是因为一贯的本科或者其他教材都是这么说的: ...
- MFC中使用用户剪贴板
代码逻辑: 拷贝功能: 1.从编辑控件中获取文本. 2.打开并清空剪贴板.(OpenClipboard,EmptyClipboard) 3.创建一个全局缓冲区.(GlobalAlloc) 4.锁定缓冲 ...
- MySQL存储引擎与事务
1.作用 和磁盘的数据打交道 2.简介 MySQL 基于存储引擎管理 表空间数据数据文件 3.种类 Innodb存储引擎ibd:存储表的数据行和索引frm:表基本结构信息Myisam存储引擎frmm ...
- python pip命令技巧
确保本地开发环境,和线上一致性 1.导出当前解释器的模块pip3 freeze > requirements.txt 2.将这个文件requirements.txt,上传至服务器,在新的虚拟环境 ...