洛谷 1064 [NOIP2004] 虫食算 dfs+剪枝
来源:互联网 发布:全国大学生网络文化节 编辑:程序博客网 时间:2024/05/19 11:37
题目:
https://www.luogu.org/problem/show?pid=1092
做了一下午;
最后只有90分,然后忍不住看题解,发现了一个很高效的可行性剪枝;
最后 AC;
思路:
爆搜;
优化:
1.如果当前列左边存在3个数已知,但无论是否进位都不等 return;(高效)
2.由一式和二式推三式;(随便)
3.倒着枚举数(玄学),真心不懂,只能说服;(比较高效)
总结:
注意ans初始化为-1,因为可以为0(QAQ QAQ QAQ);
第二次犯着这个错误了;
第一次:http://blog.csdn.net/qq_36312502/article/details/77914061
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int MAXN=10001;int n,a[4][MAXN],ans[MAXN],a1,a2,a3;string s1,s2,s3;bool can[MAXN];bool pd(int y)//优化2{ for(int i=y+1;i<=n;i++) if(ans[a[1][i]]!=-1 && ans[a[2][i]]!=-1 && ans[a[3][i]]!=-1) if((ans[a[1][i]]+ans[a[2][i]])%n!=ans[a[3][i]] && (ans[a[1][i]]+ans[a[2][i]]+1)%n!=ans[a[3][i]]) return false; return true;}void dfs(int x,int y,int ge){ if(y>n && ge^1) { for(int i=1;i<=n;i++) cout<<ans[i]<<" "; exit(0); } if(!pd(y)) return; a1=ans[a[1][y]],a2=ans[a[2][y]],a3=ans[a[3][y]]; if(ans[a[x][y]]==-1 && x<=3) { if(x==3)//优化2 { int tot=a1+a2+ge; if(tot<n && !can[tot]) { can[tot]=1,ans[a[3][y]]=tot; dfs(1,y+1,0); can[tot]=0,ans[a[3][y]]=-1; } else if(tot>=n && !can[(tot+n)%n]) { can[(tot+n)%n]=1,ans[a[3][y]]=(tot+n)%n; dfs(1,y+1,1); can[(tot+n)%n]=0,ans[a[3][y]]=-1; } else return; } else for(int i=n-1;i>=0;i--)//优化3; { if(!can[i]) { can[i]=1,ans[a[x][y]]=i; dfs(x+1,y,ge); can[i]=0,ans[a[x][y]]=-1; } } return; } else { if(x>=4) { if((ge && a1+a2+1==a3) || (!ge && a1+a2==a3)) dfs(1,y+1,0); else if((ge && (a1+a2+1)%n==a3) || (!ge && (a1+a2)%n==a3)) dfs(1,y+1,1); else return; } else dfs(x+1,y,ge); } return;}void solve(){ scanf("%d",&n); cin>>s1>>s2>>s3; for(int i=1;i<=n;i++) a[1][i]=s1[n-i]-'A'+1,a[2][i]=s2[n-i]-'A'+1,a[3][i]=s3[n-i]-'A'+1; memset(ans,-1,sizeof(ans)); dfs(1,1,0); return;}int main(){ solve(); return 0;}
阅读全文
1 0
- 洛谷 1064 [NOIP2004] 虫食算 dfs+剪枝
- 【NOIP2004】虫食算 搜索+剪枝
- [NOIP2004]虫食算 T4 简单搜索+剪枝
- 【NOIP2004提高组T4】虫食算-搜索剪枝
- 洛谷 1092 虫食算 (dfs+剪枝)
- 虫食算 dfs+剪枝
- 洛谷 P1092 [NOIP2004 T4] 虫食算
- |洛谷|NOIP2004|搜索|P1092 虫食算
- 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算
- 【NOIp 2004】【DFS+剪枝】虫食算
- NOIP2004虫食算
- NOIP2004 虫食算
- 【NOIP2004】虫食算
- NOIP2004【虫食算】
- NOIP2004虫食算
- 洛谷 1731 生日蛋糕 dfs+剪枝
- dfs+剪枝
- DFS剪枝
- 用户级线程和内核级线程的区别
- Logo 首页 下载App 深度学习从小白到入门 —— 基于keras的深度学习基本概念讲解 96 作者 shikanon 2017.02.18 20:27 字数 2551 阅读
- 文献综述——1
- C++ 反转字符串
- 5.2 绑定服务的三种方式:扩展 Binder 类、使用 Messenger、使用 AIDL
- 洛谷 1064 [NOIP2004] 虫食算 dfs+剪枝
- 关于错误An exception has occurred,use %tb to see the full traceback,SystemExit
- 高斯白噪声与高斯色噪声的区别
- 数据挖掘---数据处理
- 对ListCtrl列表控件按列进行排序
- C++ STL中哈希表 hash_map从头到尾详细介绍
- ArcGIS ModelBuilder 迭代器参数传入字段计算器方法
- noip2016组合数问题
- 我的大学生活