这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵
不能相互重叠。
标签:rip content 不能 ret script sam data logs using
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵
不能相互重叠。
第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的
分值的绝对值不超过32767)。
只有一行为k个子矩阵分值之和最大为多少。
// MADE BY QT666 #include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #include<cstring> using namespace std; typedef long long ll; const int N=100050; int dp[200][200][15],f[200][15],a[200][200]; int sum[N],sum2[N],n,m,k; int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]); if(m==1){ for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i][1]; for(int p=1;p<=k;p++){ for(int i=1;i<=n;i++){ f[i][p]=max(f[i-1][p],f[i][p]); for(int j=0;j<i;j++){ f[i][p]=max(f[i][p],f[j][p-1]+sum[i]-sum[j]); } } } int ans=0; for(int i=0;i<=k;i++) ans=max(ans,f[n][i]); printf("%d\n",ans); } else{ for(int i=1;i<=n;i++) sum[i]=sum[i-1]+a[i][1]; for(int i=1;i<=n;i++) sum2[i]=sum2[i-1]+a[i][2]; for(int p=1;p<=k;p++){ for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ dp[i][j][p]=max(dp[i][j][p],max(dp[max(0,i-1)][j][p],dp[i][max(j-1,0)][p])); dp[i][j][p]=max(dp[i][j][p],dp[max(i-1,0)][max(j-1,0)][p]); for(int la=0;la<i;la++) dp[i][j][p]=max(dp[i][j][p],dp[la][j][p-1]+sum[i]-sum[la]); for(int la=0;la<j;la++) dp[i][j][p]=max(dp[i][j][p],dp[i][la][p-1]+sum2[j]-sum2[la]); if(i==j){ for(int la=0;la<i;la++) dp[i][j][p]=max(dp[i][j][p],dp[la][la][p-1]+sum[i]-sum[la]+sum2[j]-sum2[la]); } } } } int ans=0; for(int p=0;p<=k;p++) ans=max(ans,dp[n][n][p]); printf("%d\n",ans); } return 0; }
标签:rip content 不能 ret script sam data logs using
原文地址:http://www.cnblogs.com/qt666/p/7435901.html