BZOJ1084_最大子矩阵_KEY
DP。
但要分类讨论,对于M=1和M=2的情况分别讨论。
1>M=1
设f[i][j]表示选了i个矩阵,到第j位。N^3转移。(前缀和)
2>M=2
设f[i][j][k]表示选了i个矩阵,第一列到i,第二列到j。
枚举i,j,k后枚举j1和k1表示选一行的情况。
如果j==k则可以从之前的两行一起转移。
code:
- /**************************************************************
- Problem: 1084
- User: yekehe
- Language: C++
- Result: Accepted
- Time:112 ms
- Memory:1476 kb
- ****************************************************************/
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- int f[][][];
- int N,M,K,a[][],sum[][];
- int F[][];
- int S[];
- void work()
- {
- for(int i=;i<=N;i++){scanf("%d",&S[i]);S[i]+=S[i-];}
- for(int i=;i<=K;i++)for(int j=;j<=N;j++)F[i][j]=-1e9;
- for(int i=;i<=K;i++)
- for(int j=;j<=N;j++){
- F[i][j]=F[i][j-];
- for(int k=;k<j;k++){
- F[i][j]=max(F[i][j],F[i-][k]+S[j]-S[k]);
- }
- }
- printf("%d",F[K][N]);
- return ;
- }
- int main()
- {
- scanf("%d%d%d",&N,&M,&K);
- if(M==)return work(),;
- for(int i=;i<=N;i++)
- for(int j=;j<=M;j++){
- scanf("%d",&a[i][j]);
- sum[i][j]=sum[i-][j]+a[i][j];
- }
- for(int i=;i<=K;i++)for(int j=;j<=N;j++)for(int k=;k<=N;k++)f[i][j][k]=-1e9;
- for(int i=;i<=K;i++)
- for(int j=;j<=N;j++)
- for(int k=;k<=N;k++){
- f[i][j][k]=max(f[i][j-][k],f[i][j][k-]);
- for(int j1=;j1<j;j1++)
- f[i][j][k]=max(f[i][j][k],f[i-][j1][k]+sum[j][]-sum[j1][]);
- for(int k1=;k1<k;k1++)
- f[i][j][k]=max(f[i][j][k],f[i-][j][k1]+sum[k][]-sum[k1][]);
- if(j==k)
- for(int h=;h<j;h++)
- f[i][j][k]=max(f[i][j][k],f[i-][h][h]+sum[j][]-sum[h][]+sum[k][]-sum[h][]);
- }
- printf("%d",f[K][N][N]);
- return ;
- }
BZOJ1084_最大子矩阵_KEY的更多相关文章
- ACM 中 矩阵数据的预处理 && 求子矩阵元素和问题
我们考虑一个$N\times M$的矩阵数据,若要对矩阵中的部分数据进行读取,比如求某个$a\times b$的子矩阵的元素和,通常我们可以想到$O(ab)$的遍历那个子矩阵,对它的各 ...
- [BZOJ1127][POI2008] KUP子矩阵
Description 给一个n*n的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入k n(n<2000)和一个n*n的地图 Output 输出矩形的左 ...
- 【SCOI2005】 最大子矩阵 BZOJ 1084
Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵
题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K 接下 ...
- HDU1559 最大子矩阵 (二维树状数组)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1559 最大子矩阵 Time Limit: 30000/10000 MS (Java/Others) ...
- bzoj1057: [ZJOI2007]棋盘制作--最大子矩阵
既然要求最大01子矩阵,那么把应该为0的位置上的数取反,这样就变成求最大子矩阵 最大子矩阵可以用单调栈 #include<stdio.h> #include<string.h> ...
- hdu 1559 最大子矩阵
最大子矩阵 Time Limit: 30000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- NOIP2014pj子矩阵[搜索|DP]
题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...
- openjudge1768 最大子矩阵[二维前缀和or递推|DP]
总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...
随机推荐
- logback总结
Logback Logback由三大模块组成:logback-core.logback- classic和logback-access. Logback-core是其它两个模块的基础模块. Logba ...
- Tomcat – Java.Lang.OutOfMemoryError: PermGen Space
很多时候,在开发阶段Tomcat重复的重启过程中会遇到java.lang.OutOfMemoryError : PermGen space 错误. 1 2 3 4 java.lang.OutOfMem ...
- paramiko的安装与使用
paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接,支持在远程登录服务器执行命令和上传下载文件的功能. 安装 pycrypto下载地址: ...
- java笔记--守护线程的应用
守护线程的应用 Java中的线程可以分为两类,即用户线程和守护线程.用户线程是为了完成任务,而守护线程是为其他线程服务 --如果朋友您想转载本文章请注明转载地址"http://www.cnb ...
- asp.net 對象圖解
- Linux装python3
记住下载的软件最好装在/opt下默认的 大家都这样做 linux装python3.7我们以安装最新的来做测试 先下载关联的包防止出错 安装python前的库环境,非常重要yum install gc ...
- 更新tableView的某个cell
更新tableView的某个cell 异步加载完数据后更新某个cell,这应该是非常常见的使用方法了,我们经常会用reloadData. 效果: 源码: // // RootViewControlle ...
- Python3.5 执行发邮件Exchangelib(=)
fyl Python发邮件的代码如下: 只需要填写好加粗字体,即可正常使用. from exchangelib import DELEGATE, Account, Credentials, Messa ...
- handsontable 和 echarts都定义了require方法,初始化时冲突了,怎么办?
echarts初始化时报这个错误. require.config is not a function 方案一: 让其中一方的初始化不依赖于 require即可 1.去掉 var testDrowEc ...
- TreeSet 比较器排序 自定义对象
package cn.itcast.day21.treeset2; import java.util.Comparator; import java.util.TreeSet; /* * TreeSe ...