poj 2078 Matrix dfs

第一次,裸奔了下,果断TLE..

第二次,加了个剪枝,第一行的数不需要移动,移了也是重复的,这是我把3*3那个例子写了下发现的,没证明..300+ms

第三次,也许加到前面某一行时,max就大于了min,就不需要继续搜到n行去了..63ms

View Code
#include <stdio.h>

int ar[8][8],sum[8],min,n;

int judge()
{
int i,max=0;
for (i=0;i<n;i++)
if(max<sum[i])max=sum[i];
if(max>min)return 0;
return 1;
}

void dfs(int i)
{
int j,k,l,max=0;
if(i==n)
{
for (j=0;j<n;j++)
if(max<sum[j])max=sum[j];
if(max<min)min=max;
return;
}
for (l=0;l<n;l++)
{
for (k=0,j=(n-l)%n;k<n;k++,j++)
sum[k]+=ar[i][j%n];
if(judge())dfs(i+1);
for (k=0,j=(n-l)%n;k<n;k++,j++)
sum[k]-=ar[i][j%n];
}
}

int main()
{
int i,j;
while (scanf("%d",&n)!=EOF)
{
if(n==-1)break;
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
scanf("%d",&ar[i][j]);
}
min=0x3f3f3f3f;
for(i=0;i<n;i++)sum[i]=ar[0][i];
dfs(1);
printf("%d\n",min);
}
return 0;
}





posted @ 2011-10-25 23:28  104_gogo  阅读(181)  评论(0编辑  收藏  举报