【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< ...
随机推荐
- php 数据库的增删改查
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>&l ...
- D 题
题目大意:找朋友,最好把朋友最多的一堆的人数输出 运用并查集,每次更新最大数即可: 代码: #include <iostream> #include <cstdio> #inc ...
- hdu 1501 基本搜索深搜
#include<stdio.h> #include<string.h> char s1[300],s2[300],s[500]; int len1,len2,len3,fla ...
- android中的OnClickListener两种实现方式
android的activity点击事件中,通过OnClickListener来实现,要实现点击事件有两种方式 1.通过定义一个OnClickListener的内部类来实现 The example b ...
- Reactor和Proactor模式的讲解(关于异步,同步,阻塞与非阻塞)
在高性能的I/O设计中,有两个比较著名的模式Reactor和Proactor模式,其中Reactor模式用于同步I/O,而Proactor运用于异步I/O操作. 在比较这两个模式之前,我们首先的搞明白 ...
- Dividing--hdu1059(动态规划)
Problem Description Marsha and Bill own a collection of marbles. They want to split the collection a ...
- win7右下角无线网图标显示未连接,但是实际上已连接上,也能上网
首先,要确实是不是服务启动的问题,方法很简单,重新启动电脑就可以. 如果问题依旧,那么按下Win+R快捷键,输入“services.msc”,打开服务界面. 然后会看到右侧窗口出现好多设置项,找到“R ...
- Office EXCEL 的绝对引用和相对引用如何理解
比如C1 = A1+B1,则我把C1的单元格往下拖拉的时候,C2会自动等于A2+B2,C3会自动等于A3+B3,而如果让G1 = $E$1+$F$1,则把G1单元格往下拖拉的时候,G2G3单元格都不会 ...
- CSDN-markdown基本的语法说明
文件夹 概述 简介Markdown CSDN Markdown的功能支持 标题 Setext形式 atx形式 区块引用 分隔线 强调 列表 无序列表 有序列表 注意事项 链接 自己主动链接 普通文本链 ...
- 获取当前时间 YYYY-MM-DD
1.函数封装 /** * 获取当前时间 * 格式YYYY-MM-DD */ Vue.prototype.getNowFormatDate = function() { var date = new D ...