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