链接:点击打开链接
题意:这里有一个n*m的矩阵(1<=m<=2),请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int sum1[105],sum2[105][3];
int dp1[105][105],dp2[105][105][15];
int main(){
int n,m,k,i,j,p,q,num1,num2;
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
if(m==1){ //将m分情况讨论
sum1[0]=0; //m==1时,dp[i][j]表示将i个数分成j份的最大值
for(i=1;i<=n;i++){
scanf("%d",&num1);
sum1[i]=sum1[i-1]+num1;
}
memset(dp1,0,sizeof(dp1));
for(i=1;i<=n;i++){
for(j=1;j<=min(i,k);j++){
dp1[i][j]=max(dp1[i-1][j],dp1[i][j]);
for(p=0;p<=i;p++)
dp1[i][j]=max(dp1[i][j],dp1[p][j-1]+sum1[i]-sum1[p]);
}
}
printf("%d\n",dp1[n][k]);
}
else{ //m==2时
sum2[0][1]=sum2[0][2]=0; //dp[i][j][k]表示第一列取i个,第二列取j个,分成k部分的最大值
for(i=1;i<=n;i++){
scanf("%d%d",&num1,&num2);
sum2[i][1]=sum2[i-1][1]+num1;
sum2[i][2]=sum2[i-1][2]+num2;
}
memset(dp2,0,sizeof(dp2));
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
for(p=1;p<=min(i+j,k);p++){
dp2[i][j][p]=max(dp2[i][j][p],dp2[i-1][j][p]);
dp2[i][j][p]=max(dp2[i][j][p],dp2[i][j-1][p]);
for(q=0;q<=i;q++)
dp2[i][j][p]=max(dp2[i][j][p],dp2[q][j][p-1]+sum2[i][1]-sum2[q][1]);
for(q=0;q<=j;q++)
dp2[i][j][p]=max(dp2[i][j][p],dp2[i][q][p-1]+sum2[j][2]-sum2[q][2]);
if(i==j) //注意i==j时的情况
for(q=0;q<=i;q++)
dp2[i][j][p]=max(dp2[i][j][p],dp2[q][q][p-1]+sum2[i][1]-sum2[q][1]+sum2[j][2]-sum2[q][2]);
}
}
}
printf("%d\n",dp2[n][n][k]);
}
}
return 0;
}