bzoj1084&&洛谷2331[SCOI2005]最大子矩阵
题解:
分类讨论
当m=1的时候,很简单的dp,这里就不再复述了
当m=2的时候,设dp[i][j][k]表示有k个子矩阵,第一列有i个,第二列有j个
然后枚举一下当前子矩阵,状态转移
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=,M=;
int dp[N][M],f[N][N][M],k,s,ss,n,m,K,sum[N],s1[N],s2[N];
int main()
{
scanf("%d%d%d",&n,&m,&K);
if(m==)
{
for(int i=;i<=n;i++)
{scanf("%d",&k);sum[i]=sum[i-]+k;}
for(int i=;i<=n;i++)
for(int k=;k<=K;k++)
{
dp[i][k]=dp[i-][k];
for(int j=;j<i;j++)
dp[i][k]=max(dp[i][k],dp[j][k-]+sum[i]-sum[j]);
}
printf("%d",dp[n][K]);
}
else
{
for(int i=;i<=n;i++)
{scanf("%d%d",&s,&ss);s1[i]=s1[i-]+s;s2[i]=s2[i-]+ss;}
for(int k=;k<=K;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
f[i][j][k]=max(f[i-][j][k],f[i][j-][k]);
for(int l=;l<i;l++)f[i][j][k]=max(f[i][j][k],
f[l][j][k-]+s1[i]-s1[l]);
for(int l=;l<j;l++)f[i][j][k]=max(f[i][j][k],
f[i][l][k-]+s2[j]-s2[l]);
if(i==j)
for(int l=;l<i;l++)
f[i][j][k]=max(f[i][j][k],
f[l][l][k-]+s1[i]-s1[l]+s2[j]-s2[l]);
}
printf("%d",f[n][n][K]);
}
}
bzoj1084&&洛谷2331[SCOI2005]最大子矩阵的更多相关文章
- BZOJ1084或洛谷2331 [SCOI2005]最大子矩阵
BZOJ原题链接 洛谷原题链接 注意该题的子矩阵可以是空矩阵,即可以不选,答案的下界为\(0\). 设\(f[i][j][k]\)表示前\(i\)行选择了\(j\)个子矩阵,选择的方式为\(k\)时的 ...
- 洛谷 P2331 [SCOI2005]最大子矩阵
洛谷 这一题,乍一眼看上去只想到了最暴力的暴力--大概\(n^4\)吧. 仔细看看数据范围,发现\(1 \leq m \leq 2\),这就好办了,分两类讨论. 我先打了\(m=1\)的情况,拿了30 ...
- 洛谷P2331 [SCOI2005]最大子矩阵 DP
P2331 [SCOI2005]最大子矩阵 题意 : 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 第一行为n,m,k(1≤n≤ ...
- 洛谷P2331 [SCOI2005] 最大子矩阵[序列DP]
题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- 洛谷P2331[SCOI2005]最大子矩阵
题目 DP 此题可以分为两个子问题. \(m\)等于\(1\): 原题目转化为求一行数列里的\(k\)块区间的和,区间可以为空的值. 直接定义状态\(dp[i][t]\)表示前i个数分为t块的最大值. ...
- 洛谷 P1896 [SCOI2005]互不侵犯
洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...
- [Luogu 2331] [SCOI2005]最大子矩阵
[Luogu 2331] [SCOI2005]最大子矩阵 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 ...
- BZOJ1088或洛谷2327 [SCOI2005]扫雷
BZOJ原题链接 洛谷原题链接 很容易发现答案就只有\(0,1,2\)三种答案,而且只要知道第一个格子是否有雷就可以直接顺推下去了. 所以我们跑一次首位有雷,跑一次首位无雷判断是否可行即可. #inc ...
- 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...
随机推荐
- 0xc0000005:读取位置时发生访问冲突
这是空指针,比如: A* a=NULL; a->fun();//会提示标题错误,因为a没有分配空间
- Python3基础 if elif 示例 判断一个数在哪个区间内
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- compile vi from source code
1.install ncurses library (vi depend on ncurses library) ./configure --prefix=/usr --with-termlib m ...
- 动态规划模板1|LIS最长上升子序列
LIS最长上升子序列 dp[i]保存的是当前到下标为止的最长上升子序列的长度. 模板代码: int dp[MAX_N], a[MAX_N], n; int ans = 0; // 保存最大值 for ...
- 工控机安装Ubuntu14.04
开机,不停按delete,进入bios 进入boot,选择USB启动 重新开机,进入安装向导,下一步即可
- MongoDB(课时27 消除重复数据)
3.7.2 消除重复数据 在SQL中对于重复的数据可以使用"DISTINCT"消除,在MongoDB中依然支持.(distinct不同的) 范例:查询所有name的信息 本次的操作 ...
- IntelliJ IDE 开发Java GUI 入门
j主要对java 的GUI相关知识进行简单的介绍和总结,整个博客按照创建一个java GUI的顺序进行介绍,期间穿插讲解用到的java Swing的布局.控件等相关知识.本博客所进行的讲解及工程的创建 ...
- java基础深入解析基本类型
一.基本类型的简介 基本类型的两条准则: Java中,如果对整数不指定类型,默认时int类型,对小数不指定类型,默认是double类型. 基本类型由小到大,可以自动转换,但是由大到小,则需要强制类型转 ...
- 如何学好Java大数据并快速提升
Java作为一种最流行的,最热门的编程语言,可以说它无处不在,目前全球有着数十亿的设备正在运行着Java,很多服务器程序都是用Java编写,用以处理每天超过数以千万的数据.无论是手机软件.手机Java ...
- 监控视频采集与Web直播开发全流程分析
内容概要: 摄像头 => FFmpeg => Nginx服务器 => 浏览器 从摄像头拉取rtsp流 转码成rtmp流向推流服务器写入 利用html5播放 1.开发流程 1.1 通过 ...