【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< ...
随机推荐
- hdu 1162
#include<stdio.h> #include<string.h> #include<math.h> #define N 200 #define inf 99 ...
- 爱在心中(codevs 2822)
题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度 ...
- Linux中命令选项及参数简介
登录Linux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着“选项”(英文options)或“参数”(英文arguments).即Linux中命令格式为: command [opti ...
- Codeforces 653A Bear and Three Balls【水题】
题目链接: http://codeforces.com/problemset/problem/653/A 题意: 给定序列,找是否存在连续的三个数. 分析: 排序~去重~直接判断~~ 代码: #inc ...
- 洛谷—— P2802 回家
P2802 回家 题目描述 小H在一个划分成了n*m个方格的长方形封锁线上. 每次他能向上下左右四个方向移动一格(当然小H不可以静止不动), 但不能离开封锁线,否则就被打死了. 刚开始时他有满血6点, ...
- poj——3177Redundant Paths
poj——3177Redundant Paths 洛谷—— P2860 [USACO06JAN]冗余路径Redundant Paths Time Limit: 1000MS Memory ...
- 44444444444444444444444444444444dddddddddd66666666666666666666666666
dddddddddddddddddddddddddddddddddddddddddddddddddddd
- CentOS 6.x Radius
CentOS 6.x Radius 一. 实现环境: 1.系统:CentOS release 6.6 (Final) 2.需要软件包: 1) freeradius-2.1.12-6.e16.x ...
- C#构造方法(函数) C#方法重载 C#字段和属性 MUI实现上拉加载和下拉刷新 SVN常用功能介绍(二) SVN常用功能介绍(一) ASP.NET常用内置对象之——Server sql server——子查询 C#接口 字符串的本质 AJAX原生JavaScript写法
C#构造方法(函数) 一.概括 1.通常创建一个对象的方法如图: 通过 Student tom = new Student(); 创建tom对象,这种创建实例的形式被称为构造方法. 简述:用来初 ...
- Tcl学习之--列表|字典
[列表|字典] Tcl使用列表来处理各种集合,比方一个目录中的全部文件,以及一个组件的全部选项.最简单的列表就是包括由随意个空格.制表符.换行符.分隔的随意多个元素的字符串.比方: JerryAlic ...