传送门

\[\huge\mathit{warning}
\]

\[\small\text{以下说明文字高能,请心脏病,,,,,,人士谨慎观看,请未成年人在家长陪同下观看}
\]


皮这一下很开心

其实是代码很丑而已

不要在意那些奇怪的变量名,和那四个布尔函数

看到\(k\)很小,\(m\leq2\),很爽有没有,设\(f_{i,j,k}\)表示第\(i\)行的二进制状态为\(j\)(0不放,1放),选了\(k\)个矩阵的最大值.转移时枚举当前放的状态,记为\(o\),然后和上一行状态作比较,如果j不等于当前状态o,并且o不为0,k就加1

观察样例,我们注意到选出的两个子矩阵是两条竖着的,而如果用上述方法,如果要选右下角的3,那么得出来最少需要3个子矩阵

继续观察,可以发现如果上一行状态为3(二进制11),且当前行为1或2,那么这连下来的一部分可以接在上面,例如\(\begin{matrix}0&1\\1&1\\1&0\end{matrix}\)以及\(\begin{matrix}0&1\\1&1\\0&1\end{matrix}\),这两种情况都至少只有2个子矩阵.

所以,转移时,如果当前状态o不是j的子集,并且o不为0,k就加1

其实还是错的,因为有这种情况\(\begin{matrix}1&1\\1&1\\0&1\end{matrix}\),这种情况子矩阵个数为2,但是上述算法会得到1

综合上述三种情况,我们可以发现如果上一行状态为3,这一行状态为1或2,如果上一行所在的1连通块中每行状态全是3,那么k是要加1的

所以,转移时,如果当前状态o不是j的子集,或者o是j子集并且o不为0并且j所在的1连通块中每行状态全是3,k就加1

这时需要多开一维,表示并且j所在的1连通块中每行状态是否全是3

好了,剩下的详见代码

对了,注意不一定要选k个非空子矩阵

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define eps (1e-5) using namespace std;
il LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,nn,m,kk,a[4],f[2][4][2][12];
il bool o1(int o){return o>0;}
il bool o2(int j,int o){return o==3&&(j==1||j==2)&&((o&j)==j);}
il bool o3(int j,int o){return (o&j)!=o;}
il bool o4(int j,int k,int o){return j==3&&(o==1||o==2)&&(!k);} int main()
{
n=rd(),m=rd(),kk=rd();nn=1<<m;
memset(f,-63,sizeof(f));
int O=f[0][0][0][0],inf=-23333333;
f[0][0][0][0]=0;
int nw=1,la=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++) a[j]=rd();
if(m==2) a[3]=a[1]+a[2];
for(int j=0;j<nn;j++)
for(int k=0;k<=1;k++)
for(int l=0;l<=kk;l++)
{
if(f[la][j][k][l]<=inf) continue;
for(int o=0;o<nn;o++)
{
int nk=((k&o1(o))|o2(j,o)),dl=(o3(j,o)|o4(j,k,o));
f[nw][o][nk][l+dl]=max(f[nw][o][nk][l+dl],f[la][j][k][l]+a[o]);
}
f[la][j][k][l]=O;
}
nw^=1,la^=1;
}
int ans=inf;
for(int j=0;j<nn;j++)
for(int k=0;k<=1;k++)
for(int l=0;l<=kk;l++)
ans=max(ans,f[la][j][k][l]);
printf("%d\n",ans);
return 0;
}

luogu P2331 [SCOI2005]最大子矩阵的更多相关文章

  1. [Luogu 2331] [SCOI2005]最大子矩阵

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

  2. 洛谷P2331 [SCOI2005]最大子矩阵 DP

    P2331 [SCOI2005]最大子矩阵 题意 : 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 第一行为n,m,k(1≤n≤ ...

  3. 洛谷P2331 [SCOI2005] 最大子矩阵[序列DP]

    题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

  4. P2331 [SCOI2005]最大子矩阵 (动规:分类讨论状态)

    题目链接:传送门 题目: 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k( ...

  5. P2331 [SCOI2005]最大子矩阵

    题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

  6. 洛谷 P2331 [SCOI2005]最大子矩阵

    洛谷 这一题,乍一眼看上去只想到了最暴力的暴力--大概\(n^4\)吧. 仔细看看数据范围,发现\(1 \leq m \leq 2\),这就好办了,分两类讨论. 我先打了\(m=1\)的情况,拿了30 ...

  7. 洛谷P2331[SCOI2005]最大子矩阵

    题目 DP 此题可以分为两个子问题. \(m\)等于\(1\): 原题目转化为求一行数列里的\(k\)块区间的和,区间可以为空的值. 直接定义状态\(dp[i][t]\)表示前i个数分为t块的最大值. ...

  8. BZOJ 1084: [SCOI2005]最大子矩阵 DP

    1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...

  9. 1084: [SCOI2005]最大子矩阵

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1325  Solved: 670[Submit][Stat ...

随机推荐

  1. maven编译的时候跳过test

    方式1:用命令带上参数 mvn install -Dmaven.test.skip=true 方式2:在pom.xml里面配置 <plugin> <groupId>org.ap ...

  2. BZOJ2716 [Violet]天使玩偶(cdq分治+树状数组)

    非常裸的KD-tree.然而我没学啊. 考虑如何离线求一个点在平面中的曼哈顿最近点. 绝对值显得有点麻烦,于是把绝对值拆开分情况讨论一波.对于横坐标小于该点的,记录对于纵坐标的前缀x+y最大值和后缀x ...

  3. Spring bean默认为单例模式会引发并发问题吗

    在web项目中使用spring,如果网站同时很多人访问,这时候使用spring默认的单例模式的bean是否合适呢?回不回影响效率或者产生交叉呢? Spring默认的单例模式的bean,因为是单例的,所 ...

  4. POJ1860(Currency Exchange)

    题意: 给出一张各种货币交换的网络,问在网络中交换原有的货币,问货币能否增值? 解析: 判断是否存在正环即可  用spfa  负环和正环的判定方法一样  如果一个点的进队次数超过n次 则存在环 代码如 ...

  5. Twitter数据挖掘:如何使用Python分析大数据 (3)

    让我们来拉取Twitter账号@NyTimes的最近20条微博. 我们可以创建变量来存放待拉取的微博数量(即count),以及待拉取的用户(即name).然后用这两个参数调用user_timeline ...

  6. 洛谷 P1120 小木棍 [数据加强版]解题报告

    P1120 小木棍 [数据加强版] 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50. 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它 ...

  7. 【hdu5306】 Gorgeous Sequence

    http://acm.hdu.edu.cn/showproblem.php?pid=5306 (题目链接) 题意 区间取$min$操作,区间求和操作,区间求最值操作. Solution 乱搞一通竟然A ...

  8. Looper Handler Mssage

    1. 一个Handler只有一个队列;2. 在调用Handler.post(Runnable runnable)方法时,会将runnable封装成一个Message;3. 在队列执行时,会判断当前的M ...

  9. 跟我一起学习vue2(学习工程目录)[三]

    查看生成的my-project的工程目录 首先看 build是最终发布的代码存放位置. 我查看了一下目录,里面都是Js文件 config目录里面主要是配置目录,包括端口号.如果开的项目多,可以进入in ...

  10. 关于Picasso load本地图片显示失败的探究

    今天测试找过来说图片不显示了,查了一下是Picasso加载本地图片没有显示,奇怪了,以前都是这样写为什么现在不行了,难道是Picasso有bug了,怀着激动的心情断点跟进去发现 Picasso所有lo ...