题目链接:https://ac.nowcoder.com/acm/problem/20242
题目大意:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
int a[105][3], f[105][105][15], sum[3][105], dp[105][15][2];
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("%d", &a[i][j]);
}
}
for(int i=1; i<=n; i++){
sum[1][i]=sum[1][i-1]+a[i][1];
sum[2][i]=sum[2][i-1]+a[i][2];
}
memset(dp, 128, sizeof(dp));
dp[0][0][0]=0;
if(m==1){
for(int i=1; i<=n; i++){
dp[i][0][0]=0;
for(int j=1; j<=K&&j<=i; j++){
dp[i][j][1]=max(dp[i-1][j][1]+a[i][1], max(dp[i-1][j-1][0], dp[i-1][j-1][1])+a[i][1]);
dp[i][j][0]=max(dp[i-1][j][0], dp[i-1][j][1]);
}
}
printf("%d\n", max(dp[n][K][0], dp[n][K][1]));
return 0;
}
memset(f, 128, sizeof(f));
f[0][0][0]=0;
for(int i=0; i<=n; i++){
for(int j=0; j<=n; j++){
for(int k=0; k<=K; k++){
if(k==0){
f[i][j][k]=0;
continue;
}
if(i>0){
f[i][j][k]=max(f[i][j][k], f[i-1][j][k]);
}
if(j>0){
f[i][j][k]=max(f[i][j][k], f[i][j-1][k]);
}
if(i==j){
for(int w=1; w<=i; w++){
f[i][j][k]=max(f[i][j][k], f[w-1][w-1][k-1]+sum[1][i]-sum[1][w-1]+sum[2][j]-sum[2][w-1]);
}
}
for(int w=1; w<=i; w++){
f[i][j][k]=max(f[i][j][k], f[w-1][j][k-1]+sum[1][i]-sum[1][w-1]);
}
for(int w=1; w<=j; w++){
f[i][j][k]=max(f[i][j][k], f[i][w-1][k-1]+sum[2][j]-sum[2][w-1]);
}
}
}
}
printf("%d\n", f[n][n][K]);
return 0;
}
/*
*/

京公网安备 11010502036488号