POJ2531-Network Saboteur-暴力枚举+记忆化/dfs/随机化乱搞
2016-01-24 15:29
435 查看
。。。题目没什么好说的。
把n个点 分配到两个集合, 求sum= A集合每个点到B集合所有点的边的权重和
n=20;
。暴力的算法就直接枚举每种情况
1、暴力枚举复杂度 2^19 * 20*20 复杂度略大..TLE...加个剪枝去掉一半 也要跑1S .POJ的数据太水。。
枚举的时候可以利用位运算,重复利用一下之前的结果(复杂度2^n * n ),不用每次枚举把所有的值都求和,大概也能跑200ms
2、dfs,没剪枝也能过2^20* n ...400ms,比枚举快多了(枚举干了很多不必要的加法...)
剪枝: 把求A-B之间最大外部和转为求AB各自最小内部和...
有些大牛剪完枝直接就16MS了。。。
3、随机化乱搞... 每次随机改变1个节点从A到B 或B到A,for 一遍更新sum值,重复10W次,基本都ac了,当然和数据规模有关系啦.... 参考别人的代码大概也是100+MS
关于bitmask。。之前一直是 遍历i的每一位...今天看别人的写法会 更快一些...
暴力枚举+记忆化:
暴力枚举代码: 1S
dfs:200ms
随机化乱搞:http://blog.csdn.net/sssogs/article/details/8221244
把n个点 分配到两个集合, 求sum= A集合每个点到B集合所有点的边的权重和
n=20;
。暴力的算法就直接枚举每种情况
1、暴力枚举复杂度 2^19 * 20*20 复杂度略大..TLE...加个剪枝去掉一半 也要跑1S .POJ的数据太水。。
枚举的时候可以利用位运算,重复利用一下之前的结果(复杂度2^n * n ),不用每次枚举把所有的值都求和,大概也能跑200ms
2、dfs,没剪枝也能过2^20* n ...400ms,比枚举快多了(枚举干了很多不必要的加法...)
剪枝: 把求A-B之间最大外部和转为求AB各自最小内部和...
有些大牛剪完枝直接就16MS了。。。
3、随机化乱搞... 每次随机改变1个节点从A到B 或B到A,for 一遍更新sum值,重复10W次,基本都ac了,当然和数据规模有关系啦.... 参考别人的代码大概也是100+MS
关于bitmask。。之前一直是 遍历i的每一位...今天看别人的写法会 更快一些...
暴力枚举+记忆化:
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <stack> #include <iostream> using namespace std; double eps=0.000001; int tm[25][25]; int set[25]; int vis[5+(1<<20)]; int f[5+(1<<20)]; int main() { int st,i,j,k; int n; cin>>n; for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { scanf("%d",&tm[i][j]); } } int maxx=0; int all=1<<(n)-1; for (k=1;k<all;k++) { if (vis[k]) continue; vis[k]=1; vis[k^all]=1; //剪枝1/2,使得复杂度变成 2^(n-1) //-k&k是求k的lowbit位(最低位边的1) //k-lowbit(k)得到【A集合】的上一个状态 //那么当前状态的sum值f[k]=f[last]+当前新增的点x到B集合的sum-之前A集合到x的sum int lowbit=-k&k; int last=k-lowbit; f[k]=f[last]; int x=0; //j便是新增的点 while(lowbit) {x++;lowbit>>=1;} for (j=1;j<=n;j++) { if ((1<<(j-1))&last)//表示j已经在A集合 f[k]-=tm[x][j]; else //j在B集合 f[k]+=tm[x][j]; } f[k^all]=f[k]; if (f[k]>maxx) maxx=f[k]; } printf("%d\n",maxx); return 0; }
暴力枚举代码: 1S
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <stack> #include <iostream> using namespace std; __int64 inf=15; double eps=0.000001; int tm[25][25]; int set[25]; int vis[1<<20+5]; int main() { int st,i,j,k; int n; cin>>n; for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { scanf("%d",&tm[i][j]); } } __int64 maxx=0; int all=1<<(n)-1; for (k=0;k<=all;k++) { if (vis[k]) continue; vis[k]=1; vis[k^all]=1; //剪枝1/2,使得复杂度变成 2^(n-1) set[1]++; for (i=1;i<=n;i++) { if (set[i]==2) { set[i]=0; set[i+1]++; } else break; } __int64 sum=0; for(i=1;i<=n;i++) { if (!set[i]) continue; for (j=1;j<=n;j++) { if (!set[j]) sum+=tm[i][j]; } } if (sum>maxx)maxx=sum; } printf("%I64d\n",maxx); return 0; }
dfs:200ms
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <stack> #include <iostream> using namespace std; double eps=0.000001; int tmd[25][25]; int set[25]; int maxx; int n; int dfs(int x,int sum) { if (x>n) { if (sum>maxx) maxx=sum; return 0; } int tmdp=0,i;set[x]=0; for (i=1;i<=x;i++) { if (!set[i]) continue; tmdp+=tmd[i][x];//不把x选入A,sum+=[x到A集的和] } dfs(x+1,sum+tmdp); tmdp=0; set[x]=1; for (i=1;i<=x;i++) { if (set[i])continue; tmdp+=tmd[i][x]; //把x选入A,sum+=[x到B集的和] } dfs(x+1,sum+tmdp); } int main() { int st,i,j,k; int t; cin>>n; for (i=1;i<=n;i++) { for (j=1;j<=n;j++) { scanf("%d",&tmd[i][j]); } } maxx=0; dfs(1,0); printf("%d\n",maxx); return 0; }
随机化乱搞:http://blog.csdn.net/sssogs/article/details/8221244
相关文章推荐
- android 基础知识点(面试准备)
- 【Redis笔记(四)】 Redis数据结构 - list链表
- SpringMVC接收json数据中的一些问题(415错误的解决)
- 构造,析构,覆盖,重载,隐藏
- A Primer on Open-Source NoSQL Databases
- 【源】从零自学Hadoop(10):Hadoop1.x与Hadoop2.x
- 【源】从零自学Hadoop(11):Hadoop命令上
- 【源】从零自学Hadoop(12):Hadoop命令中
- 【源】从零自学Hadoop(13):Hadoop命令下
- 【源】从零自学Hadoop(14):Hive介绍及安装
- 【源】从零自学Hadoop(15):Hive表操作
- 【源】从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上
- 【源】从零自学Hadoop(17):Hive数据导入导出,集群数据迁移下
- [置顶]【源】从零自学Hadoop系列索引
- servelt笔记一
- 贪心&Moving Tables
- Android seekBar2.环形进度条
- 我是怎么处理其他网站恶意爬虫博客园的,希望大家喜欢(第二弹)
- 多年前写的DataTable与实体类的转换,已放github
- 多年前写的文本框扩展控件(有ValueChanging事件等),已放github