zoukankan      html  css  js  c++  java
  • BZOJ_1084_[SCOI2005]_最大子矩阵_(动态规划)

    描述


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

    给出一个n*m的矩阵,其中m<=2,取k个子矩阵,求最大子矩阵和.

    分析


    1.m=1时

    dp[i][k]表示在前i列里面选k个的最优解.那么对于第i列,有选和不选两种可能.则有:

    dp[i][k]=max(dp[i-1][k],max{dp[x][k-1]+s1[i]-s1[x]}(0<x<i))

    2.m=2时

    dp[i][j][k]表示第一行前i列,第二行前j列选k个的最优解.那么可以分开考虑每一行的那一列选不选的情况,最后如果i==j,还要考虑两列一起选的情况.则有:

    dp[i][j][k]=max(dp[i-1][j][k],dp[i][j-1][k],max{dp[x][j][k-1]+s1[i]-s1[x]}(0<x<i),max{dp[i][x][k-1]+s2[j]-s2[x]}(0<x<j),max{dp[x][x][k-1]+s1[i]-s1[x]+s2[j]-s2[x]}(0<x<i,0<x<j)))

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int maxn=100+5;
     5 int n,m,K;
     6 int s[2][maxn];
     7 int dp1[maxn][15],dp2[maxn][maxn][15];
     8 int main(){
     9     scanf("%d%d%d",&n,&m,&K);
    10     for(int i=1;i<=n;i++)for(int j=0;j<m;j++){
    11         int t; scanf("%d",&t);
    12         s[j][i]=s[j][i-1]+t;
    13     }
    14     if(m==1){
    15         for(int i=1;i<=n;i++)for(int k=1;k<=K;k++){
    16             dp1[i][k]=dp1[i-1][k];
    17             for(int x=0;x<i;x++) dp1[i][k]=max(dp1[i][k],dp1[x][k-1]+s[0][i]-s[0][x]);
    18         }
    19         printf("%d
    ",dp1[n][K]);
    20     }
    21     else{
    22         for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=K;k++){
    23             dp2[i][j][k]=max(dp2[i-1][j][k],dp2[i][j-1][k]);
    24             for(int x=0;x<i;x++) dp2[i][j][k]=max(dp2[i][j][k],dp2[x][j][k-1]+s[0][i]-s[0][x]);
    25             for(int x=0;x<j;x++) dp2[i][j][k]=max(dp2[i][j][k],dp2[i][x][k-1]+s[1][j]-s[1][x]);
    26             if(i==j)for(int x=0;x<i;x++) dp2[i][j][k]=max(dp2[i][j][k],dp2[x][x][k-1]+s[0][i]-s[0][x]+s[1][j]-s[1][x]);
    27         }
    28         printf("%d
    ",dp2[n][n][K]);
    29     }
    30     return 0;
    31 }
    View Code

    1084: [SCOI2005]最大子矩阵

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 2115  Solved: 1049
    [Submit][Status][Discuss]

    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

    Source

  • 相关阅读:
    【java】jfairy和java-faker假数据利器
    【Spring boot】【gradle】idea新建spring boot+gradle项目
    【mac】mac上使用brew 安装速度慢/每次使用brew 都会卡在updating homebrew不动/更换homebrew的镜像源
    【gradle】mac上安装gradle
    【mac】mac上安装JDK
    如何解决ajax跨域问题(转)
    java实现点选汉字验证码(自己修改后的)
    AES加解密
    java随机打乱集合顺序
    利用StringEscapeUtils对字符串进行各种转义与反转义(Java)
  • 原文地址:https://www.cnblogs.com/Sunnie69/p/5542718.html
Copyright © 2011-2022 走看看