1084: [SCOI2005]最大子矩阵

题目连接:

http://www.lydsy.com/JudgeOnline/problem.php?id=1084

Description

这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。

Input

第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。

Output

只有一行为k个子矩阵分值之和最大为多少。

Sample Input

3 2 2

1 -3

2 3

-2 3

Sample Output

9

Hint

题意

题解:

首先我们注意m只有2

所以我们分开考虑即可,m=1的时候,dp[i][k]表示考虑第i个,分割了k块的最大值,然后无脑转移就好了

m=2的时候也是一样的,dp[i][j][k]表示上面考虑到第i个,下面考虑到了第j个,分割了k块

代码

#include<bits/stdc++.h>
using namespace std; int n,m,k;
int sum1[120];
int sum2[120];
int dp1[120][12];
int dp2[120][120][12];
void solve1()
{
for(int i=1;i<=n;i++)
{
int x;scanf("%d",&x);
sum1[i]=sum1[i-1]+x;
}
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
for(int t=1;t<=k;t++)
{
dp1[i][t]=max(dp1[i][t],dp1[j][t-1]+sum1[i]-sum1[j]);
dp1[i][t]=max(dp1[i][t],dp1[j][t]);
}
printf("%d\n",dp1[n][k]);
}
void solve2()
{
for(int i=1;i<=n;i++)
{
int x,y;scanf("%d%d",&x,&y);
sum1[i]=sum1[i-1]+x;
sum2[i]=sum2[i-1]+y;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i==j)
{
for(int x=0;x<i;x++)
{
for(int t=1;t<=k;t++)
{
dp2[i][j][t]=max(dp2[i][j][t],dp2[x][x][t-1]+sum1[i]-sum1[x]+sum2[i]-sum2[x]);
dp2[i][j][t]=max(dp2[i][j][t],dp2[x][x][t]);
}
}
}
for(int i2=0;i2<i;i2++)
{
for(int t=1;t<=k;t++)
{
dp2[i][j][t]=max(dp2[i][j][t],dp2[i2][j][t-1]+sum1[i]-sum1[i2]);
dp2[i][j][t]=max(dp2[i][j][t],dp2[i2][j][t]);
}
}
for(int j2=0;j2<j;j2++)
{
for(int t=1;t<=k;t++)
{
dp2[i][j][t]=max(dp2[i][j][t],dp2[i][j2][t-1]+sum2[j]-sum2[j2]);
dp2[i][j][t]=max(dp2[i][j][t],dp2[i][j2][t]);
}
}
}
}
printf("%d\n",dp2[n][n][k]);
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
if(m==1)solve1();
if(m==2)solve2();
}

BZOJ 1084: [SCOI2005]最大子矩阵 DP的更多相关文章

  1. [BZOJ 1084] [SCOI2005] 最大子矩阵 【DP】

    题目链接:BZOJ - 1084 题目分析 我看的是神犇BLADEVIL的题解. 1)对于 m = 1 的情况, 首先可能不取 Map[i][1],先 f[i][k] = f[i - 1][k];   ...

  2. bzoj 1084: [SCOI2005]最大子矩阵【dp】

    分情况讨论,m=1的时候比较简单,设f[i][j]为到i选了j个矩形,前缀和转移一下就行了 m=2,设f[i][j][k]为1行前i个,2行前j个,一共选了k个,i!=j的时候各自转移同m=1,否则转 ...

  3. BZOJ 1084 [SCOI2005]最大子矩阵 - 动态规划

    传送门 题目大意: 从矩阵中取出k个互不重叠的子矩阵,求最大的和. 题目分析: 对于m=1,直接最大m子段和. 对于m=2: \(dp[i][j][k]\)表示扫描到第一列i和第2列j时选取了k个矩阵 ...

  4. BZOJ: 1084: [SCOI2005]最大子矩阵

    NICE 的DP 题,明白了题解真是不错. Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1228  Solved: 622[Submit][Stat ...

  5. 【BZOJ 1084】 1084: [SCOI2005]最大子矩阵 (DP)

    1084: [SCOI2005]最大子矩阵 Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第 ...

  6. BZOJ(6) 1084: [SCOI2005]最大子矩阵

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3566  Solved: 1785[Submit][Sta ...

  7. 1084: [SCOI2005]最大子矩阵

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1325  Solved: 670[Submit][Stat ...

  8. Bzoj 1088: [SCOI2005]扫雷Mine (DP)

    Bzoj 1088: [SCOI2005]扫雷Mine 怒写一发,算不上DP的游戏题 知道了前\(i-1\)项,第\(i\)项会被第二列的第\(i-1\)得知 设\(f[i]\)为第一列的第\(i\) ...

  9. 洛谷P2331 [SCOI2005]最大子矩阵 DP

    P2331 [SCOI2005]最大子矩阵 题意 : 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 第一行为n,m,k(1≤n≤ ...

随机推荐

  1. 理解Mysql的索引与优化

    转自:http://www.cnblogs.com/hustcat/archive/2009/10/28/1591648.html 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库 ...

  2. 存储过程中使用事务与try catch

    一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 : ) ) ...

  3. Selenium2Library系列 keywords 之 _SelectElementKeywords 之 select_from_list_by_label(self, locator, *labels)

    def select_from_list_by_label(self, locator, *labels): """Selects `*labels` from list ...

  4. Solaris系统管理(二)资源管理与网络配置

    上一篇主要总结了Solaris安装后需要进行的一些设置,如ssh,pkgutil管理依赖,vim安装. 这一篇将会对Solaris资源管理与网络配置进行总结. 四 Solaris 系统管理 1,查询总 ...

  5. 【JNI】OPUS压缩与解压的JNI调用(.DLL版本)

    OPUS压缩与解压的JNI调用(.DLL版本) 一.写在开头: 理论上讲,这是我在博客园的第一篇原创的博客,之前也一直想找个地方写点东西,把最近做的一些东西归纳总结下,但是一般工程做完了一高兴就把东西 ...

  6. 提问:"~"运算符

    本人有一段代码关于"~"运算符 public class m{ public static void main(String[] args){ int x=~5; System.o ...

  7. Leetcode: Length of Last Word in python

    Length of Last Word Total Accepted: 47690 Total Submissions: 168587     Given a string s consists of ...

  8. Juniti学习总结

    JUnit简介 JUnit是由 Erich Gamma和Kent Beck编写的一个回归测试框架(regression testing framework).JUnit测试是程序员测试,即所谓白盒测试 ...

  9. enum 使用

    1.说明 enum是一个基本的关键字,却一直没弄清楚怎么用,这次在实现二叉树框架时需要用到常量,特地搜了一下,终于知道怎么用了. 2.enum使用要点 enum声明是一个类型,不是变量. enum经常 ...

  10. 浅谈Spark(1) - Overview

    Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapReduce的是 ...