[SCOI2005]最大子矩阵

原创 2016年08月29日 14:55:49

Dp!Dp!Dp!一个Dp蒟蒻的博客里写满了DP题,真不知道我之前是怎么想的……
任意门
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

这个代码我原来不想写注释的,但是真的很难,想了很久都想不出来,还是谢谢吧~QaQ

#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,K,a[110][20],f[110][110][20],sum[110][20];
int main(){
    scanf("%d%d%d",&n,&m,&K);
    memset(sum[0],0,sizeof(sum[0]));//memset(sum,0,sizeof(sum));也可以,省时间而已 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            sum[i][j]=sum[i-1][j]+a[i][j];//前缀数组啦,记录第j行前i个总和
        }
    }
    memset(f,0,sizeof(f));
    if(m==1){
        f[1][1][1]=a[1][1];//前1个取一个的最大值不就是取自己吗......
        for(int i=2;i<=n;i++){//第二个开始没意见吧
            for(int k=1;k<=K;k++){
                f[i][1][k]=f[i-1][1][k];
                for(int j=i-1;j>=k-1;j--){
                    f[i][1][k]=max(f[i][1][k],(sum[i][1]-sum[j][1])+f[j][1][k-1]);//Dp方程啦。。。
                }
            }
        } 
        printf("%d\n",f[n][1][K]);
    }
    else{
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                for(int k=1;k<=K;k++){
                    f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k]);
                    for(int ed=i-1;ed>=k-1;ed--)f[i][j][k]=max(f[i][j][k],(sum[i][1]-sum[ed][1])+f[ed][j][k-1]);
                    for(int ed=j-1;ed>=k-1;ed--)f[i][j][k]=max(f[i][j][k],(sum[j][2]-sum[ed][2])+f[i][ed][k-1]);
                    if(i==j){
                        for(int ed=i-1;ed>=k-1;ed--){
                            f[i][j][k]=max(f[i][j][k],(sum[i][1]-sum[ed][1])+(sum[j][2]-sum[ed][2])+f[ed][ed][k-1]);
                        }
                    }
                }
            }
            //同上原理啦
        }
        printf("%d\n",f[n][n][K]);
    }
    return 0;
}

我发誓以后再也不做Dp啦。。。

版权声明:原创文章,请转载表明链接

bzoj1084: [SCOI2005]最大子矩阵-DP

现在已经能自然的想到分类讨论了。 注意到m=1或者2,当m=1时,是普通的最大连续字段和,只不过是k个: 设f[i][j]表示前i个数中取出j个矩形的最大和 转移: 选:f[i][j]=max...
  • zz_ylolita
  • zz_ylolita
  • 2016年02月10日 00:28
  • 1214

[SCOI2005] 最大子矩阵

本题地址http://www.luogu.org/problem/show?pid=2331题目描述这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩...
  • QWsin
  • QWsin
  • 2016年06月16日 20:42
  • 573

最大子矩阵问题&悬线法 学习笔记

幽人竹桑园,归卧寂无喧。 物情今已见,从此欲无言。 ——少伯
  • Clove_unique
  • Clove_unique
  • 2016年01月17日 10:49
  • 2823

[SCOI2005]最大子矩阵

Description这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。 Sample Input3 2 2 1 -3 2 3 -2 ...
  • xgc_woker
  • xgc_woker
  • 2016年08月26日 12:24
  • 210

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

动态规划~
  • Regina8023
  • Regina8023
  • 2015年02月21日 00:09
  • 456

【BZOJ1084】[SCOI2005]最大子矩阵【DP】

【题目链接】 终于A了这题了。 m = 1和m = 2两种情况分开做。 对于m = 1,很简单的DP。设dp[k][n]表示前n个数字,分为k段的最大权值。 (1)不取第n个数,d...
  • BraketBN
  • BraketBN
  • 2016年04月15日 22:42
  • 148

[BZOJ 1084][SCOI2005]最大子矩阵

Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。 Input 第一行为n,m,k(1≤n≤100,1≤...
  • qpswwww
  • qpswwww
  • 2014年06月08日 20:46
  • 773

【bzoj1084】 [SCOI2005]最大子矩阵

1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2715  Solved: 1350 [Submit][S...
  • Joky_2002
  • Joky_2002
  • 2017年04月27日 18:37
  • 185

[BZOJ1084]SCOI2005最大子矩阵|DP

我好弱啊这题不是应该一下就想到的吗我想了这么久。。     注意到m,这就好办了嘛。。m=1的时候好弄,f[i][j]表示前i个数选j个的最大和, 有f[i][j]=min(f[i-1][j],...
  • Tag_king
  • Tag_king
  • 2015年04月23日 14:48
  • 263

BZOJ1084: [SCOI2005]最大子矩阵

Portal注意到m只能为1或2 分类讨论。 m=1的时候其实就是最大K段连续子段和。 f[i][j]=max(f[i][j],max(f[k][j],f[k][j−1]+sum[i]−sum[...
  • Ep1C_HeReT1c
  • Ep1C_HeReT1c
  • 2017年02月27日 11:18
  • 94
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[SCOI2005]最大子矩阵
举报原因:
原因补充:

(最多只允许输入30个字)