有生之年,敲这么长的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; }