题意:在一个n*m的矩阵中选择k个子矩阵,这k个子矩阵互不相交,求这k个子矩阵分值最大为多少?
思路:dp
dp[k][i][j]为在第一列前i个,第二列前j个,选择k个矩阵的最大值。
分析我们动态所加的一个元素参与结果的情况。既枚举所加元素在第一列前i个,第二列前j个中所有矩阵加上在该矩阵外选(k-1)个子矩阵的值。
代码:
#include<bits/stdc++.h> #define ll long long #define inf 1e9 using namespace std; ll dp[105][105][105], d[105][5], sum[105][5]; int main() { int n, m, K; scanf("%d%d%d",&n,&m,&K); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%lld",&d[i][j]); sum[i][j]=sum[i-1][j]+d[i][j]; } } for(int k=1;k<=K;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { dp[k][i][j]=-inf; if(i==j) { for(int l=0;l<i;l++) { dp[k][i][j]=max(dp[k][i][j],dp[k-1][l][l]+sum[i][1]-sum[l][1]+sum[j][2]-sum[l][2]); } } for(int l=0;l<i;l++) { dp[k][i][j]=max(dp[k][i][j],dp[k-1][l][j]+sum[i][1]-sum[l][1]); } for(int l=0;l<j;l++) { dp[k][i][j]=max(dp[k][i][j],dp[k-1][i][l]+sum[j][2]-sum[l][2]); } dp[k][i][j]=max(dp[k][i][j],max(dp[k][i][j-1],dp[k][i-1][j])); } } } printf("%lld\n",dp[K][n][n]); return 0; }