P2258 子矩阵 (搜索,动态规划)
题目链接
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 子矩阵 (搜索,动态规划)的更多相关文章
- P2258 子矩阵——搜索+dp
		P2258 子矩阵 二进制枚举套二进制枚举能过多一半的点: 我们只需要优化一下第二个二进制枚举的部分: 首先我们先枚举选哪几行,再预处理我们需要的差值,上下,左右: sum_shang,sum_hen ... 
- 洛谷 P2258 子矩阵 解题报告
		P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第 2 . 4行和第 ... 
- 【BZOJ1084】最大子矩阵(动态规划)
		[BZOJ1084]最大子矩阵(动态规划) 题面 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式 ... 
- 洛谷P2258 子矩阵
		P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4 ... 
- P2258 子矩阵(dp)
		P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4 ... 
- 洛谷P2258 子矩阵 题解 状态压缩/枚举/动态规划
		作者:zifeiy 标签:状态压缩.枚举.动态规划 题目链接:https://www.luogu.org/problem/P2258 这道题目状态压缩是肯定的,我们需要用二进制来枚举状态. 江湖上有一 ... 
- luogu P2258 子矩阵 |动态规划
		题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第22.44行和第22.44.55列交叉 ... 
- 洛谷 P2258 子矩阵
		题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ... 
- HDU 1081 To the Max 最大子矩阵(动态规划求最大连续子序列和)
		Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any ... 
随机推荐
- Problem Y: 哪一天,哪一秒?
			Problem Y: 哪一天,哪一秒? Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 337 Solved: 196[Submit][Status][ ... 
- jquery源码学习第一天
			第一天认识了jquery的大体结构,总的大范围是 (function() { // 这里是封装的代码,包括了各种方法.工具 window.JQuery = JQuery window.$ = $; } ... 
- 禁止按键F5和禁止鼠标右键菜单 js代码
			<script language="javascript"> //禁止按键F5 document.onkeydown = function(e){ e = window ... 
- Qt的由来和发展
			一.Qt的由来 Haavard Nord 和Eirik Chambe-Eng于1991年开始开发"Qt",1994年3月4日创立公司,早名为Quasar Technologies, ... 
- python入门:CONTINUE 的作用  跳出本次循环后,重新开始循环
			#!/usr/bin/env python # -*- coding:utf-8 -*- # CONTINUE 的作用 跳出本次循环后,重新开始循环 import time while True: ' ... 
- 【linux】服务说明
			引用自<鸟哥的linux私房菜> http://cn.linux.vbird.org/linux_server/0210network-secure_3.php 服务名称 服务内容 a ... 
- 【php】php安全问题
			使用 —enable-force-cgi-redirect 选项 设置 doc_root 或 user_dir 或 open_basedir PHP运行的用户身份不能为ROOT 数据库字段加密 程序不 ... 
- POJ:2777-Count Color(线段树+状压)
			Count Color Time Limit: 1000MS Memory Limit: 65536K Description Chosen Problem Solving and Program d ... 
- Mybatis中接口和对应的mapper文件位置配置详解
			Mybatis中接口和对应的mapper文件位置配置详解 原链接为:https://blog.csdn.net/fanfanzk1314/article/details/71480954 今天遇到一个 ... 
- Django Model two
			Django_model: eg: class XXXX(models.Model): nid = models.AutoField(primary_Key=True) name = models.C ... 
