对于m=1的情况:dp[j][i]表示选到i位,选了j个的最优值
对于m=2的情况:dp[l][i][j]表示第一列选到了i第二列选到了j选了l个的最优值
/**************************************************************
Problem: 1084
User: syh0313
Language: C++
Result: Accepted
Time:380 ms
Memory:2440 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
const
long
long
inf=1e18;
int
n,m,k,sum[2][110],x,sum1[110];
long
long
dp1[12][110],dp[12][110][110];
using
namespace
std;
int
main()
{
scanf
(
"%d%d%d"
,&n,&m,&k);
if
(m==1)
{
for
(
int
j=0;j<=k;j++)
for
(
int
i=0;i<=n;i++) dp1[j][i]=-inf;
for
(
int
i=1;i<=n;i++)
scanf
(
"%d"
,&x),sum1[i]=sum1[i-1]+x;
dp1[0][0]=0;
for
(
int
i=1;i<=n;i++)
{
for
(
int
j=0;j<=k;j++) dp1[j][i]=dp1[j][i-1];
for
(
int
j=1;j<=k;j++)
for
(
int
pre=i-1;pre>=0;pre--)
dp1[j][i]=max(dp1[j][i],dp1[j-1][pre]+sum1[i]-sum1[pre]);
}
printf
(
"%lld\n"
,dp1[k][n]);
return
0;
}
for
(
int
i=1;i<=n;i++)
{
int
x,y;
scanf
(
"%d%d"
,&x,&y);
sum[0][i]=sum[0][i-1]+x; sum[1][i]=sum[1][i-1]+y;
}
for
(
int
l=0;l<=k;l++)
for
(
int
i=0;i<=n;i++)
for
(
int
j=0;j<=n;j++) dp[l][i][j]=-inf;
dp[0][0][0]=0;
for
(
int
i=0;i<=n;i++)
for
(
int
j=0;j<=n;j++)
if
(i+j!=0)
{
for
(
int
l=0;l<=k;l++)
{
for
(
int
pre=i-1;pre>=0;pre--)
{
dp[l][i][j]=max(dp[l][i][j],dp[l][pre][j]);
if
(l-1>=0)
{
dp[l][i][j]=max(dp[l][i][j],dp[l-1][pre][j]+sum[0][i]-sum[0][pre]);
//printf("%d i=%d j=%d <- %d prei=%d prej=%d %lld\n",l,i,j,l-1,pre,j,dp[l][i][j]);
}
}
for
(
int
pre=j-1;pre>=0;pre--)
{
dp[l][i][j]=max(dp[l][i][j],dp[l][i][pre]);
if
(l-1>=0)
{
dp[l][i][j]=max(dp[l][i][j],dp[l-1][i][pre]+sum[1][j]-sum[1][pre]);
//printf("kdkd %d i=%d j=%d <- %d prei=%d prej=%d %lld\n",l,i,j,l-1,i,pre,dp[l][i][j]);
}
}
if
(i==j)
{
for
(
int
pre=i-1;pre>=0;pre--)
{
dp[l][i][j]=max(dp[l][i][j],dp[l][pre][pre]);
if
(l-1>=0) dp[l][i][j]=max(dp[l][i][j],dp[l-1][pre][pre]+sum[0][i]+sum[1][i]-sum[0][pre]-sum[1][pre]);
if
(l-2>=0) dp[l][i][j]=max(dp[l][i][j],dp[l-2][pre][pre]+sum[0][i]+sum[1][i]-sum[0][pre]-sum[1][pre]);
}
}
}
}
printf
(
"%lld\n"
,dp[k][n][n]);
return
0;
}