#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
using namespace std;
typedef long long LL;
#define mp make_pair<int,bool>
#define pb tran[s][i].push_back(make_pair<int,bool>(to_num(b),true))
inline LL read()
{
LL x=0;bool f=0;char c=getchar();
for (;c<'0'||c>'9';c=getchar()) f=c=='-'?1:0;
for (;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
return f?-x:x;
}
const int N=100+1,M=1<<14,K=6+1;
int n,m,w[N][K],f[N][K][M],ans=-0x3f3f3f3f;
vector<pair<int,bool> > tran[M][K];
vector<pair<int,bool> >::iterator it;
inline int to_num(int *a)
{
int rec=0;
for (int i=0;i<=m;i++) rec|=a[i]<<(i<<1);
return rec;
}
void cal(int s)
{
static int a[7],b[7],ano[7],stk[10],st;st=0;
for (int i=0;i<=m;i++) a[i]=(s>>i*2)&3;
for (int i=0;i<=m;i++)
{
if (a[i]==3) return;
else if (!a[i]) continue;
else if (a[i]==1) stk[st++]=i;
else
{
if (!st) return;
ano[i]=stk[st-1],ano[stk[st-1]]=i,ano[--st]=0;
}
}
if (st) return;
for (int i=1;i<=m;i++)
{
memcpy(b,a,sizeof b);
switch (a[i-1]<<2|a[i])
{
case 0<<2|0:
{
tran[s][i].push_back(mp(to_num(b),0));
b[i-1]=1;b[i]=2;pb;
break;
}
case 0<<2|1:
{
pb;
b[i-1]=1;b[i]=0;pb;
break;
}
case 0<<2|2:
{
pb;
b[i-1]=2;b[i]=0;pb;
break;
}
case 1<<2|0:
{
pb;
b[i-1]=0;b[i]=1;pb;
break;
}
case 1<<2|1:
{
b[i-1]=b[i]=0;b[ano[i]]=1;pb;
break;
}
case 1<<2|2:
{
b[i-1]=b[i]=0;
if (!to_num(b)) tran[s][i].push_back(mp(-1,1));
break;
}
case 2<<2|0:
{
pb;
b[i-1]=0;b[i]=2;pb;
break;
}
case 2<<2|1:
{
b[i-1]=b[i]=0;pb;
break;
}
case 2<<2|2:
{
b[i-1]=b[i]=0;b[ano[i-1]]=2;pb;
break;
}
}
}
}
int main()
{
memset(f,0x80,sizeof f);
n=read();m=read();
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) w[i][j]=read();
for (int i=0;i<1<<(m+1<<1);i++) cal(i);
f[0][0][0]=0;
for (int i=0;i<n;i++)
{
for (int j=1;j<=m;j++)
for (int s=0;s<1<<(m+1<<1);s++)
for (it=tran[s][j].begin();it!=tran[s][j].end();it++)
{
int &val=(~it->first)?f[i][j][it->first]:ans;
val=max(val,f[i][j-1][s]+it->second*w[i+1][j]);
}
for (int s=0;s<1<<(m<<1);s++)
f[i+1][0][s<<2]=f[i][m][s];
}
printf("%d\n",ans);
}
bzoj1187【插头dp】
最新推荐文章于 2019-05-08 21:23:53 发布