| ||||||||||
| 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 | |||||||||
把dfs中最上面的判断由if(Sum>ans) 改为if(Sum>=ans) ,就由16MS变成了172MSIn Reply To:终于剪枝到16MS了。。 Posted by:a798253982 at 2013-07-30 09:48:52 > /*
> 1.等价剪枝:根据对称性剪枝
> 2.无法达最优:提前剪枝
> 3.换个角度,更高效搜索算法 :如本题逆向思维求最小内部代价
> */
>
> #include <cstdio>
> #include <cstring>
>
> int M[20][20],n,ans,arr1[20],arr2[20];
>
> void dfs(int Sum,int p1,int p2,int cur)
> {
> if(Sum>=ans)
> return;
> else if(cur==20)
> ans=Sum;
> else
> {
> int sum,temp,temp1,temp2;
>
> sum=0;
> for(int i=0;i<p1;i++)
> sum+=M[arr1[i]][cur];
> temp1=arr1[p1];
> arr1[p1]=cur;
> dfs(Sum+sum,p1+1,p2,cur+1);
> arr1[p1]=temp1;
>
> sum=0;
> for(int i=0;i<p2;i++)
> sum+=M[arr2[i]][cur];
> temp2=arr2[p2];
> arr2[p2]=cur;
> dfs(Sum+sum,p1,p2+1,cur+1);
> arr2[p2]=temp2;
> }
> }
>
> int main(){
> int i,j,ans1,ans2,total=0;
> while(~scanf("%d",&n))
> {
> for(i=0;i<n;i++)
> for(j=0;j<n;j++){
> scanf("%d",&M[i][j]);total+=M[i][j];
> }
>
> ans1=0;
> for(i=0;i<n/2;i++)
> for(j=0;j<n/2;j++)
> ans1+=M[i][j];
> ans1/=2;
>
> ans2=0;
> for(i=n/2;i<n;i++)
> for(j=n/2;j<n;j++)
> ans2+=M[i][j];
> ans2/=2;
>
> memset(arr1,0,sizeof(arr1));
> memset(arr2,0,sizeof(arr2));
> arr1[0]=0;
> ans=ans1+ans2;
> dfs(0,1,0,1);
> printf("%d\n",total/2-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