C11CUT - Cắt bảng
Tác giả: skyvn97
Ngôn ngữ: C++
#include<stdio.h>
#define MAX 17
int a[MAX][MAX];
int x[MAX][MAX];
long best;
int m,n;
void update(void)
{
int i,j,k;
long sum,val;
bool saw[MAX][MAX];
for (i=1;i<=m;i=i+1)
for (j=1;j<=n;j=j+1)
saw[i][j]=false;
sum=0;
for (i=1;i<=m;i=i+1)
for (j=1;j<=n;j=j+1)
{
if (saw[i][j]) continue;
val=a[i][j];
if (x[i][j]==1)
{
for (k=j+1;k<=n;k=k+1)
{
if (x[i][k]!=1) break;
else
{
val=val*10+a[i][k];
saw[i][k]=true;
}
}
}
if (x[i][j]==2)
{
for (k=i+1;k<=m;k=k+1)
{
if (x[k][j]!=2) break;
else
{
val=val*10+a[k][j];
saw[k][j]=true;
}
}
}
sum=sum+val;
saw[i][j]=true;
}
if (sum>best) best=sum;
}
void btrk(int r,int c)
{
int i;
for (i=1;i<=2;i=i+1)
{
x[r][c]=i;
if (c==n)
{
if (r==m) update();
else btrk(r+1,1);
}
else btrk(r,c+1);
}
}
void init(void)
{
int i,j;
scanf("%d",&m);
scanf("%d",&n);
for (i=1;i<=m;i=i+1)
for (j=1;j<=n;j=j+1) scanf("%d",&a[i][j]);
best=0;
}
int main(void)
{
init();
btrk(1,1);
printf("%ld",best);
}