【SCOI 2005】 最大子矩阵
【题目链接】
【算法】
动态规划
我们发现,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】 最大子矩阵的更多相关文章
- [ SCOI 2005 ] 最大子矩阵
\(\\\) \(Description\) 给出一个\(N\times M\)的有权矩阵,选出其中\(K\)个互不重叠的子矩阵,使得这\(K\)个子矩阵的权值和最大. \(N\in [1,100]\ ...
- BZOJ 1084 (SCOI 2005) 最大子矩阵
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3560 Solved: 1779 [Submit][Sta ...
- 【BZOJ 1087】【SCOI 2005】互不侵犯King
http://www.lydsy.com/JudgeOnline/problem.php?id=1087 很简单的状压,需要预处理,我两个状态可不可以挨着的预处理出错WA了好几次. 这个位运算预处理好 ...
- [SCOI 2005]王室联邦
Description “余”人国的国王想重新编制他的国家.他想把他的国家划分成若干个省,每个省都由他们王室联邦的一个成员来管理.他的国家有n个城市,编号为1..n.一些城市之间有道路相连,任意两个不 ...
- 解题:SCOI 2005 骑士精神
题面 我把这个当做IDA*的模板题的说,说说我个人对IDA*的理解 IDA*是一个DFS,和A*一样,它也有一个乐观的估价函数.这里这个估价函数是用来限制状态的扩展的,如果当前代价加上乐观的估计都无法 ...
- 【题解】互不侵犯 SCOI 2005 BZOJ 1087 插头dp
以前没学插头dp的时候觉得这题贼难,根本不会做,学了才发现原来是一裸题. 用二进制表示以前的格子的状态,0表示没放国王,1表示放了国王. 假设当前位置为(x,y),需要记录的是(x-1,y-1)至(x ...
- 【SCOI 2005】 扫雷
[题目链接] 点击打开链接 [算法] 只要第一行第一个数确定了,后面的数也都确定了 递推两遍即可 [代码] #include<bits/stdc++.h> using namespace ...
- 【SCOI 2005】 繁忙的都市
[题目链接] 点击打开链接 [算法] 题目描述比较繁琐,但细心观察后,发现其实就是用kruskal算法求最小生成树 [代码] #include<bits/stdc++.h> using n ...
- 【SCOI 2005】 互不侵犯
[题目链接] 点击打开链接 [算法] 和HDU2167类似 先搜出一行内符合的状态,然后,f[i][j][k]表示第i行,第j种状态,放了k个,合法的方案,DP即可 [代码] #include< ...
随机推荐
- (在线工具)JSON字符串转换成Java实体类(POJO)
http://www.bejson.com/json2javapojo/ 付代码代码转换示例: public static FixMixedOrderResponse serialization(St ...
- [NOIP2002] 提高组 洛谷P1034 矩形覆盖
题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这 ...
- BZOJ1733: [Usaco2005 feb]Secret Milking Machine 神秘的挤奶机
n<=200个点m<=40000条边无向图,求 t次走不经过同条边的路径从1到n的经过的边的最大值 的最小值. 最大值最小--二分,t次不重边路径--边权1的最大流. #inclu ...
- 《effective C++》:条款07——为多态基类声明virtual析构函数
在继承中,基类的析构函数需要定义为虚析构函数数否则: (1)当派生类对象经由一个base类指针删除时,而这个base类的析构函数不是虚函数时,其结果是未定义的. (2)这样做会导致derived类部分 ...
- msp430入门编程46
msp430中C语言的人机交互--基于状态机菜单
- php 压缩数据存储
php 压缩数据存储 当接收到大量的数据时,存储到数据库和从数据库读取时,时间都比较慢,所以压缩一下入库可能会好一点. 仅供参考!!! 封装的压缩数据函数: /** * 压缩数据 * @param s ...
- Spring注解 @Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析
@Repository.@Service.@Controller 这几个是一个类型,其实@Component 跟他们也是一个类型的 Spring 2.5 中除了提供 @Component 注释外,还定 ...
- poj2773求第K个与m互质的数
//半年前做的,如今回顾一下,还是有所收货的,数的唯一分解,.简单题. #include<iostream> #include<cstring> using namespace ...
- 洛谷——P2872 [USACO07DEC]道路建设Building Roads
P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...
- Free命令详解和释放linux Cache(转载)
因为LINUX的内核机制,一般情况下不需要特意去释放已经使用的cache.这些cache起来的内容可以增加文件以及的读写速度. 先说下free命令怎么看内存 [root@yuyii proc]# fr ...