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;
}





转载于:https://www.cnblogs.com/104-gogo/archive/2011/10/25/2224606.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值