【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< ...
随机推荐
- hexo干货系列:(二)hexo主题下载及配置
前言 上一篇文章介绍了hexo+gitHub简易搭建属于自己的个人独立博客,但是主题是默认的landscape,略显简单,今天的教程推荐Jacman主题. Jacman是一款为Hexo打造的一款扁平化 ...
- [Go]条件语句
package main import ( "io/ioutil" "fmt" ) //条件语句 //if的条件语句不需要括号 //if的条件里可以赋值,if的 ...
- HDU 4405 飞行棋上的数学期望
突然发现每次出现有关数学期望的题目都不会做,就只能找些虽然水但自己还是做不出的算数学期望的水题练练手了 题目大意: 从起点0点开始到达点n,通过每次掷色子前进,可扔出1,2,3,4,5,6这6种情况, ...
- HDU1686 计算模式串匹配的次数
题目大意: 输入一个T,表示有T组测试数据: 每组测试数据包括一个字符串W,T,T长度大于W小于1000000,w长度小于10000,计算W匹配到T中成功的次数: 这题很明显要用KMP算法,不然很容易 ...
- Linux(5):正则表达式 & 权限
正则表达式: 特殊符号: '' ---> 所见即所得,里面的内容都会被原封不动的输出出来 "" ---> 与单引号类似,但其中的特殊符号会被解析运行 `` ---> ...
- Codevs 二叉树遍历问题 合集
2010 求后序遍历 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 白银 Silver 题目描述 Description 输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列. ...
- javascript实现 京东淘宝等商城的商品图片大图预览功能(图片放大器)
在京东和淘宝等购买东西的时候,我们会经常预览左侧商品展示图片,把鼠标放到原图,右侧就会有个大图显示出细节.本文将带领大家写一个这样简单的功能! 一.实现原理 当鼠标移入某一图片内部时,图片上部会出 ...
- NodeJS+MongoDB+AngularJS+Bootstrap书店示例
目录 一.Bootstrap 1.1.添加引用 1.2.在页面中使用BootStrap 1.3.可视化布局 二.使用MongoDB创建数据库 2.1.启动MongoDB数据库 2.2.启动数据库GUI ...
- cds.data:=dsp.data赋值有时会出现AV错误剖析
cds.data:=dsp.data赋值有时会出现AV错误剖析 如果QUERY没有查询到任何数据,cds.data:=dsp.data赋值会触发AV错误. 大家知道,DATASNAP有许多远程方法就是 ...
- EJB学习(三)——java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to..
在上一篇博客介绍了怎样使用使用Eclipse+JBOSS创建第一个EJB项目,在这期间就遇到一个错误: Exception in thread "main" java.lang.C ...