| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:一个剪枝16ms,0ms是怎么出来的?In Reply To:Re:一个剪枝16ms,0ms是怎么出来的? Posted by:openxxx at 2010-02-21 13:48:32 > 0ms。。。
#include<stdio.h>
int map[25][25];
int in[25];
int out[25];
int n,ans;
void dfs(int k,int s,int ni,int no)
{
int i,sum;
if(s>=ans)
return;
sum=0;
for(i=1;i<=ni;i++)
sum+=map[in[i]][k];
if(k==n)
{
if(s+sum<ans)
ans=s+sum;
}
else
{
in[ni+1]=k;
dfs(k+1,s+sum,ni+1,no);
}
sum=0;
for(i=1;i<=no;i++)
sum+=map[out[i]][k];
if(k==n)
{
if(s+sum<ans)
ans=s+sum;
}
else
{
out[no+1]=k;
dfs(k+1,s+sum,ni,no+1);
}
return;
}
int main()
{
int i,j,k,p=0,q=0;
scanf("%d",&n);
ans=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
ans+=map[i][j];
}
}
k=ans/2;
for(i=1;i<=n/2-1;i++)
{
for(j=1;j<=n/2-1;j++)
p+=map[i][j];
}
p=p/2;
for(i=n/2;i<=n;i++)
{
for(j=n/2;j<=n;j++)
q+=map[i][j];
}
q=q/2;
ans=p+q;
in[1]=1;
dfs(2,0,1,0);
printf("%d\n",k-ans);
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator