| ||||||||||
| 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:50:37 > #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