题目链接: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;
}
/*

*/