0
点赞
收藏
分享

微信扫一扫

最大子矩阵 (多维dp)

最大子矩阵

文章目录


链接:https://ac.nowcoder.com/acm/contest/24213/1044

题目描述
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。
注意:选出的k个子矩阵 不能相互重叠。
输入描述:
第一行为n,m,k(1 ≤ n ≤ 100,1 ≤ m ≤ 2,1 ≤ k ≤ 10),
接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。
输出描述:
只有一行为k个子矩阵分值之和最大为多少。
示例1
输入

3 2 2
1 -3
2 3
-2 3

输出

9

在这里插入图片描述

AC代码

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e6 + 10;
int a[110][110];
int dp[110][110][20];
int s[110][3]; //前缀和

int main(){
    int n, m, t;
    cin >> n >> m >> t;
    for (int i = 1; i <= n;i ++)
        for (int j = 1; j <= m;j ++){
            cin >> a[i][j];
            s[i][j] = s[i - 1][j] + a[i][j];
        }
    for (int i = 1; i <= n;i ++){
        for (int j = 1; j <= n;j ++){
            for (int k = 1; k <= t;k ++){
                dp[i][j][k] = max(dp[i - 1][j][k], dp[i][j - 1][k]);
                for (int p = 0; p < i;p ++)
                    dp[i][j][k] = max(dp[i][j][k], dp[p][j][k - 1] + s[i][1] - s[p][1]);
                for(int p=0;p<j;p++)
                    dp[i][j][k]=max(dp[i][j][k],dp[i][p][k-1]+s[j][2]-s[p][2]);
                if(i==j)
                    for(int p=0;p<i;p++)
                        dp[i][j][k]=max(dp[i][j][k],dp[p][p][k-1]+s[i][1]+s[j][2]-s[p][1]-s[p][2]);    
            }
        }
    }
    cout<<dp[n][n][t];
    return 0;
}
举报

相关推荐

0 条评论