http://acm.hdu.edu.cn/showproblem.php?pid=2625
随便写出一个dfs然后猥琐随机化法剪枝,第一次AC的战绩是1/18,还跑了700+ms,随机50w次成功率还这么低。。。最近rp真是太烂了有木有。。。
View Code
#include <iostream> #include <cstdlib> #include <ctime> using namespace std ; int map[30][30] ; int n ; int ans ; int vis[30] ; void dfs(int d) { if(d==n) { int temp=0 ; for(int i=0;i<n;i++) if(vis[i]) for(int j=0;j<n;j++) if(!vis[j]) temp+=map[i][j] ; if(ans<temp) ans=temp ; return ; } vis[d]=1 ; dfs(d+1) ; vis[d]=0 ; dfs(d+1) ; } int main() { while(~scanf("%d",&n)) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&map[i][j]) ; memset(vis,0,sizeof(vis)) ; ans=0 ; if(n<20) dfs(0) ; else { int times=500000 ; srand(time(0)) ; while(times--) { vis[rand()%n]^=1 ; int temp=0 ; for(int i=0;i<n;i++) if(vis[i]) for(int j=0;j<n;j++) if(!vis[j]) temp+=map[i][j] ; if(ans<temp) ans=temp ; } } printf("%d.\n",ans) ; } return 0 ; }