【题目链接】

点击打开链接

【算法】

动态规划

我们发现,M只有两种取值,1和2,那么,只需分类讨论即可

当M = 1时,其实这个问题就成了就最大连续子段和的问题,只不过要选K段而已

用f[i][j]表示选到第i行,选了j段,那么,显然有 : f[i][j] = max{f[i-1][j],f[k][j-1] + sum[i] - sum[k]}(sum为前缀和)

当M = 2时,我们用f[i][j][k]表示第一列选到第i行,第二列选到第j行,选了k段

那么 :

如果不取,f[i][j][k] = max{f[i-1][j][k],f[i][j-1][k]}

如果第一列取,f[i][j][k] = max{f[t][j][k-1] + sum[i][1] - sum[t][1]}

如果第二列取,   f[i][j][k] = max{f[i][t][k-1] + sum[i][2] - sum[t][2]}

如果第一二列都取,我们可以把它看成两种情况

第一种,看成一个大矩形,f[i][j][k] = max{f[t][t][k-1] + sum[i][1] - sum[t][1] + sum[i][2] - sum[t][2]}

第二种,看成两个小矩形,f[i][j][k] = max{f[t][t][k-2] + sum[i][1] - sum[t][1] + sum[i][2] - sum[t][2]} (k > 1)

此题就是需要我们认真读题,如果发现了"1<=M<=2",那么,问题就变得简单多了!

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 110
#define MAXK 12
const int INF = 2e9; int n,m,k; inline void solve1()
{
int i,j,t;
static int a[MAXN],sum[MAXN],f[MAXN][MAXK];
for (i = ; i <= n; i++)
{
for (j = ; j <= k; j++)
{
f[i][j] = -INF;
}
}
memset(sum,,sizeof(sum));
for (i = ; i <= n; i++)
{
scanf("%d",&a[i]);
sum[i] = sum[i-] + a[i];
}
for (i = ; i <= n; i++)
{
for (j = ; j <= k; j++)
{
f[i][j] = f[i-][j];
for (t = ; t < i; t++)
{
f[i][j] = max(f[i][j],f[t][j-]+sum[i]-sum[t]);
}
}
}
printf("%d\n",f[n][k]);
}
inline void solve2()
{
int i,j,x,y;
static int a[MAXN][],sum[MAXN][],f[MAXN][MAXN][MAXK];
for (i = ; i <= n; i++)
{
for (j = ; j <= n; j++)
{
for (x = ; x <= k; x++)
{
f[i][j][x] = -INF;
}
}
}
memset(sum,,sizeof(sum));
for (i = ; i <= n; i++)
{
scanf("%d%d",&a[i][],&a[i][]);
sum[i][] = sum[i-][] + a[i][];
sum[i][] = sum[i-][] + a[i][];
}
for (i = ; i <= n; i++)
{
for (j = ; j <= n; j++)
{
for (x = ; x <= k; x++)
{
f[i][j][x] = max(f[i-][j][x],f[i][j-][x]);
for (y = ; y < i; y++) f[i][j][x] = max(f[i][j][x],f[y][j][x-]+sum[i][]-sum[y][]);
for (y = ; y < j; y++) f[i][j][x] = max(f[i][j][x],f[i][y][x-]+sum[j][]-sum[y][]);
if (i == j)
{
for (y = ; y < i; y++)
{
f[i][j][x] = max(f[i][j][x],f[y][y][x-]+sum[i][]-sum[y][]+sum[i][]-sum[y][]);
if (x > ) f[i][j][x] = max(f[i][j][x],f[y][y][x-]+sum[i][]-sum[y][]+sum[i][]-sum[y][]);
}
}
}
}
}
printf("%d\n",f[n][n][k]);
} int main()
{ scanf("%d%d%d",&n,&m,&k);
if (m == ) solve1();
else solve2(); return ;
}

【SCOI 2005】 最大子矩阵的更多相关文章

  1. [ SCOI 2005 ] 最大子矩阵

    \(\\\) \(Description\) 给出一个\(N\times M\)的有权矩阵,选出其中\(K\)个互不重叠的子矩阵,使得这\(K\)个子矩阵的权值和最大. \(N\in [1,100]\ ...

  2. BZOJ 1084 (SCOI 2005) 最大子矩阵

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3560 Solved: 1779 [Submit][Sta ...

  3. 【BZOJ 1087】【SCOI 2005】互不侵犯King

    http://www.lydsy.com/JudgeOnline/problem.php?id=1087 很简单的状压,需要预处理,我两个状态可不可以挨着的预处理出错WA了好几次. 这个位运算预处理好 ...

  4. [SCOI 2005]王室联邦

    Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不 ...

  5. 解题:SCOI 2005 骑士精神

    题面 我把这个当做IDA*的模板题的说,说说我个人对IDA*的理解 IDA*是一个DFS,和A*一样,它也有一个乐观的估价函数.这里这个估价函数是用来限制状态的扩展的,如果当前代价加上乐观的估计都无法 ...

  6. 【题解】互不侵犯 SCOI 2005 BZOJ 1087 插头dp

    以前没学插头dp的时候觉得这题贼难,根本不会做,学了才发现原来是一裸题. 用二进制表示以前的格子的状态,0表示没放国王,1表示放了国王. 假设当前位置为(x,y),需要记录的是(x-1,y-1)至(x ...

  7. 【SCOI 2005】 扫雷

    [题目链接] 点击打开链接 [算法] 只要第一行第一个数确定了,后面的数也都确定了 递推两遍即可 [代码] #include<bits/stdc++.h> using namespace ...

  8. 【SCOI 2005】 繁忙的都市

    [题目链接] 点击打开链接 [算法] 题目描述比较繁琐,但细心观察后,发现其实就是用kruskal算法求最小生成树 [代码] #include<bits/stdc++.h> using n ...

  9. 【SCOI 2005】 互不侵犯

    [题目链接] 点击打开链接 [算法] 和HDU2167类似 先搜出一行内符合的状态,然后,f[i][j][k]表示第i行,第j种状态,放了k个,合法的方案,DP即可 [代码] #include< ...

随机推荐

  1. 八数码难题 双向搜索(codevs 1225)

    题目描述 Description Yours和zero在研究A*启发式算法.拿到一道经典的A*问题,但是他们不会做,请你帮他们.问题描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字 ...

  2. ubuntu,CentOS永久修改主机名

    1.查看主机名 在Ubuntu系统中,快速查看主机名有多种方法: 其一,打开一个GNOME终端窗口,在命令提示符中可以看到主机名,主机名通常位于“@”符号后: 其二,在终端窗口中输入命令:hostna ...

  3. T1503 愚蠢的宠物 codevs

    http://codevs.cn/problem/1503/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 大家都知道,sh ...

  4. SQL Server 2008 R2 安装时提示“Reporting Services目录数据库文件存在”

    打开MSSQL数据库管理系统的安装目录,例如: X:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA. 其中 X:\ ...

  5. linux字符驱动之poll机制按键驱动

    在上一节中,我们讲解了如何自动创建设备节点,实现一个中断方式的按键驱动.虽然中断式的驱动,效率是蛮高的,但是大家有没有发现,应用程序的死循环里的读函数是一直在读的:在实际的应用场所里,有没有那么一种情 ...

  6. Linux面试题完整修订附加答案

    册一: 1.Linux挂载Winodws共享文件夹 第一步:先在Windows上创建一个共享目录        Windows系统IP是172.16.18.56;共享文件夹:E:\test       ...

  7. 【APUE】信号量、互斥体和自旋锁

    http://www.cnblogs.com/biyeymyhjob/archive/2012/07/21/2602015.html http://blog.chinaunix.net/uid-205 ...

  8. 【深度探索c++对象模型】Function语义学之成员函数调用方式

    非静态成员函数 c++的设计准则之一就是:非静态成员函数至少和一般的非成员函数有相同的效率.编译器内部已将member函数实体转换为对等的nonmember函数实体. 转化步骤: 1.改写函数原型以安 ...

  9. PHP的类中的常量,静态变量的问题。

    自己在写一个小型的 angularJS 库的时候,觉得 javascript 中的很多概念有点像是PHP中的概念. 像类常量, 类中的静态变量(类的静态变量是类的所有实例都共享的),这些概念虽然在 j ...

  10. jpa删除根据对象删除失败,报Removing a detached instance 错

    引用:https://blog.csdn.net/zhanggnol/article/details/6307936 常用数据库表的删除办法,一般都会在DAO类中提供delete.如下例: publi ...