题目链接


Solution

搜索+DP.

刚好把搜索卡死的数据范围...

然后应该可以很容易想到枚举行的情况,然后分列去DP.

行的情况直接全排列即可,复杂度最高 \(O(C_{16}^{8})\).

然后分列进行 DP, \(f[i][j]\) 代表以 \(i\) 为结尾,选了 \(j\) 个的答案.

之后就是个简单的线性 DP ,对一些绝对值差进行预处理,复杂度 \(O(n^3)\) .

总复杂度 \(O(C_{16}^{8}*n^3)\) ,可以过.

Code

#include<bits/stdc++.h>
using namespace std;
int n,m,r,c;
int w[20][20];
int ans=0x3f3f3f3f;
int a[20]; void solve()
{
int lc[20]={0},rc[20][20]={0},f[20][20]={0};
// 以 j 为结尾,长度为 k;
for(int i=1;i<=m;i++)
for(int j=1;j<=r;j++)
{
for(int k=1;k<i;k++)
rc[i][k]+=abs(w[a[j]][i]-w[a[j]][k]);
if(j>1)
lc[i]+=abs(w[a[j]][i]-w[a[j-1]][i]);
}
memset(f,127,sizeof(f));
f[1][1]=lc[1]; f[0][0]=0;
for(int j=1;j<=m;j++)
for(int k=1;k<=min(j,c);k++)
for(int i=0;i<j;i++)
f[j][k]=min(f[j][k],f[i][k-1]+rc[j][i]+lc[j]);
for(int i=c;i<=m;i++)
ans=min(f[i][c],ans);
return;
} void dfs(int x)
{
if(x==r)
{solve();return;}
for(int i=a[x]+1;i<=n-(r-x)+1;i++)
{a[x+1]=i;dfs(x+1);}
} int main()
{
scanf("%d%d%d%d",&n,&m,&r,&c);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&w[i][j]);
dfs(0);
cout<<ans<<endl;
return 0;
}

P2258 子矩阵 (搜索,动态规划)的更多相关文章

  1. P2258 子矩阵——搜索+dp

    P2258 子矩阵 二进制枚举套二进制枚举能过多一半的点: 我们只需要优化一下第二个二进制枚举的部分: 首先我们先枚举选哪几行,再预处理我们需要的差值,上下,左右: sum_shang,sum_hen ...

  2. 洛谷 P2258 子矩阵 解题报告

    P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第 2 . 4行和第 ...

  3. 【BZOJ1084】最大子矩阵(动态规划)

    [BZOJ1084]最大子矩阵(动态规划) 题面 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式 ...

  4. 洛谷P2258 子矩阵

    P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4 ...

  5. P2258 子矩阵(dp)

    P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4 ...

  6. 洛谷P2258 子矩阵 题解 状态压缩/枚举/动态规划

    作者:zifeiy 标签:状态压缩.枚举.动态规划 题目链接:https://www.luogu.org/problem/P2258 这道题目状态压缩是肯定的,我们需要用二进制来枚举状态. 江湖上有一 ...

  7. luogu P2258 子矩阵 |动态规划

    题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第22.44行和第22.44.55列交叉 ...

  8. 洛谷 P2258 子矩阵

    题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...

  9. HDU 1081 To the Max 最大子矩阵(动态规划求最大连续子序列和)

    Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ...

随机推荐

  1. Problem Y: 哪一天,哪一秒?

    Problem Y: 哪一天,哪一秒? Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 337  Solved: 196[Submit][Status][ ...

  2. jquery源码学习第一天

    第一天认识了jquery的大体结构,总的大范围是 (function() { // 这里是封装的代码,包括了各种方法.工具 window.JQuery = JQuery window.$ = $; } ...

  3. 禁止按键F5和禁止鼠标右键菜单 js代码

    <script language="javascript"> //禁止按键F5 document.onkeydown = function(e){ e = window ...

  4. Qt的由来和发展

    一.Qt的由来 Haavard Nord 和Eirik Chambe-Eng于1991年开始开发"Qt",1994年3月4日创立公司,早名为Quasar Technologies, ...

  5. python入门:CONTINUE 的作用 跳出本次循环后,重新开始循环

    #!/usr/bin/env python # -*- coding:utf-8 -*- # CONTINUE 的作用 跳出本次循环后,重新开始循环 import time while True: ' ...

  6. 【linux】服务说明

     引用自<鸟哥的linux私房菜>  http://cn.linux.vbird.org/linux_server/0210network-secure_3.php 服务名称 服务内容 a ...

  7. 【php】php安全问题

    使用 —enable-force-cgi-redirect 选项 设置 doc_root 或 user_dir 或 open_basedir PHP运行的用户身份不能为ROOT 数据库字段加密 程序不 ...

  8. POJ:2777-Count Color(线段树+状压)

    Count Color Time Limit: 1000MS Memory Limit: 65536K Description Chosen Problem Solving and Program d ...

  9. Mybatis中接口和对应的mapper文件位置配置详解

    Mybatis中接口和对应的mapper文件位置配置详解 原链接为:https://blog.csdn.net/fanfanzk1314/article/details/71480954 今天遇到一个 ...

  10. Django Model two

    Django_model: eg: class XXXX(models.Model): nid = models.AutoField(primary_Key=True) name = models.C ...