有生之年,敲这么长的dp代码,记录一下~
//一题不会是真的.
#include <bits/stdc++.h>
using namespace std;
//f(i,j,l,r,k1,k2)//到了第几行 选了几个数 选的数的左端点 右端点是什么 左端点是递增/递减 右端点是递增/递减
int f[16][16*16][16][16][2][2];
int sum[16][16],x;
struct vv{
int a,b;
};
struct node{
int aa,ab,ac,ad,ae,af;
}pre[16][16*16][16][16][2][2];
node t;
vector<vv>v;
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",&x);
sum[i][j]+=sum[i][j-1]+x;//记录下前缀嘛
}
}
//开始DP
/*
先写DP方程:(0表示递增 1表示递减)
if(j>=(r-l+1)&&l1<=l&&r>=l&&r1>=r)
0 0->1 1 f[i][j][l][r][1][1]=max(f[i][j][l][r][1][1],f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1]);
if(j>=(r-l+1)&&l1<=l&&l<=r1&&r>=r1)
0 0->1 0 f[i][j][l][r][1][0]=max(f[i][j][l][r][1][0],f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1]);
if(j>=(r-l+1)&&l<=l1&&r>=l1&&r1>=r)
0 0->0 1 f[i][j][l][r][0][1]=max(f[i][j][l][r][0][1],f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1]);
if(j>=(r-l+1)&&l<=l1&&l1<=r1&&r1<=r)
0 0->0 0 f[i][j][l][r][0][0]=max(f[i][j][l][r][0][0],f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1]);
if(j>=(r-l+1)&&l1<=l&&r>=l&&r1>=r)
1 1->1 1 f[i][j][l][r][1][1]=max(f[i][j][l][r][1][1],f[i-1][j-(r-l+1)][l1][r1][1][1]+sum[i][r]-sum[i][l-1]);
if(j>=(r-l+1)&&l1<=l&&r>=l&&r1>=r)
1 0->1 1 f[i][j][l][r][1][1]=max(f[i][j][l][r][1][1],f[i-1][j-(r-l+1)][l1][r1][1][0]+sum[i][r]-sum[i][l-1]);
if(j>=(r-l+1)&&l1<=l&&l<=r1&&r>=r1)
1 0->1 0 f[i][j][l][r][1][0]=max(f[i][j][l][r][1][0],f[i-1][j-(r-l+1)][l1][r1][1][0]+sum[i][r]-sum[i][l-1]);
if(j>=(r-l+1)&&l1<=l&&r>=l&&r1>=r)
0 1->1 1 f[i][j][l][r][1][1]=max(f[i][j][l][r][1][1],f[i-1][j-(r-l+1)][l1][r1][0][1]+sum[i][r]-sum[i][l-1]);
if(j>=(r-l+1)&&l<=l1&&r>=l1&&r1>=r)
0 1->0 1 f[i][j][l][r][0][1]=max(f[i][j][l][r][0][1],f[i-1][j-(r-l+1)][l1][r1][0][1]+sum[i][r]-sum[i][l-1]);
*/
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=k;j++)
{
for(int l=1;l<=m;l++)
{
for(int r=l;r<=m;r++)
{
for(int l1=1;l1<=m;l1++)
{
for(int r1=1;r1<=m;r1++)
{
if(j>=(r-l+1)&&l1<=l&&r>=l&&r1>=r)
{
if(f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1]>f[i][j][l][r][1][1])
{
f[i][j][l][r][1][1]=f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1];
pre[i][j][l][r][1][1]={i-1,j-(r-l+1),l1,r1,0,0};
}
}
if(j>=(r-l+1)&&l1<=l&&l<=r1&&r>=r1)
{
if(f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1]>f[i][j][l][r][1][0])
{
f[i][j][l][r][1][0]=f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1];
pre[i][j][l][r][1][0]={i-1,j-(r-l+1),l1,r1,0,0};
}
}
if(j>=(r-l+1)&&l<=l1&&r>=l1&&r1>=r)
{
if(f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1]>f[i][j][l][r][0][1])
{
f[i][j][l][r][0][1]=f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1];
pre[i][j][l][r][0][1]={i-1,j-(r-l+1),l1,r1,0,0};
}
}
if(j>=(r-l+1)&&l<=l1&&l1<=r1&&r1<=r)
{
if(f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1]>f[i][j][l][r][0][0])
{
f[i][j][l][r][0][0]=f[i-1][j-(r-l+1)][l1][r1][0][0]+sum[i][r]-sum[i][l-1];
pre[i][j][l][r][0][0]={i-1,j-(r-l+1),l1,r1,0,0};
}
}
if(j>=(r-l+1)&&l1<=l&&r>=l&&r1>=r)
{
if(f[i-1][j-(r-l+1)][l1][r1][1][1]+sum[i][r]-sum[i][l-1]>f[i][j][l][r][1][1])
{
f[i][j][l][r][1][1]=f[i-1][j-(r-l+1)][l1][r1][1][1]+sum[i][r]-sum[i][l-1];
pre[i][j][l][r][1][1]={i-1,j-(r-l+1),l1,r1,1,1};
}
}
if(j>=(r-l+1)&&l1<=l&&r>=l&&r1>=r)
{
if(f[i-1][j-(r-l+1)][l1][r1][1][0]+sum[i][r]-sum[i][l-1]>f[i][j][l][r][1][1])
{
f[i][j][l][r][1][1]=f[i-1][j-(r-l+1)][l1][r1][1][0]+sum[i][r]-sum[i][l-1];
pre[i][j][l][r][1][1]={i-1,j-(r-l+1),l1,r1,1,0};
}
}
if(j>=(r-l+1)&&l1<=l&&l<=r1&&r>=r1)
{
if(f[i-1][j-(r-l+1)][l1][r1][1][0]+sum[i][r]-sum[i][l-1]>f[i][j][l][r][1][0])
{
f[i][j][l][r][1][0]=f[i-1][j-(r-l+1)][l1][r1][1][0]+sum[i][r]-sum[i][l-1];
pre[i][j][l][r][1][0]={i-1,j-(r-l+1),l1,r1,1,0};
}
}
if(j>=(r-l+1)&&l1<=l&&r>=l&&r1>=r)
{
if(f[i-1][j-(r-l+1)][l1][r1][0][1]+sum[i][r]-sum[i][l-1]>f[i][j][l][r][1][1])
{
f[i][j][l][r][1][1]=f[i-1][j-(r-l+1)][l1][r1][0][1]+sum[i][r]-sum[i][l-1];
pre[i][j][l][r][1][1]={i-1,j-(r-l+1),l1,r1,0,1};
}
}
if(j>=(r-l+1)&&l<=l1&&r>=l1&&r1>=r)
{
if(f[i-1][j-(r-l+1)][l1][r1][0][1]+sum[i][r]-sum[i][l-1]>f[i][j][l][r][0][1])
{
f[i][j][l][r][0][1]=f[i-1][j-(r-l+1)][l1][r1][0][1]+sum[i][r]-sum[i][l-1];
pre[i][j][l][r][0][1]={i-1,j-(r-l+1),l1,r1,0,1};
}
}
if(j==k)
{
for(int il=0;il<2;il++)
{
for(int jl=0;jl<2;jl++)
{
if(f[i][j][l][r][il][jl]>ans)
{
ans=f[i][j][l][r][il][jl];
t={i,j,l,r,il,jl};
}
}
}
}
}
}
}
}
}
}
printf("Oil : %d \n",ans);
while(k)
{
int i=t.aa,j=t.ab,l=t.ac,r=t.ad,k1=t.ae,k2=t.af;
k-=(r-l+1);
for(int y=l;y<=r;y++)
{
printf("%d %d\n",i,y);
}
t=pre[i][j][l][r][k1][k2];
}
return 0;
}

京公网安备 11010502036488号