一开始最容易想到间隔最多为n,但是结点还是太多了,需要优化。

预处理:预判一下并保存下一个可以放的位置距离之前的距离。这样可以减少很多判断。

最优化剪枝:如果当前长度+剩下没放的程序*最短间隔如果大于等于ans,那么对答案没有贡献,可以剪去。

优化:占用和不占用两种状态,如果横向来看可以压缩为int,判断时用上为运算。

此题挂在长度的枚举上,我把长度为n给忽略了,实际上可以只有一部分长度为n。

#include<bits/stdc++.h>
//using namespace std; //#define local const int maxn = ;
const int N = ;
int tab[N]; int ans; int ivs[maxn],SZ; void dfs(int d,int* pre,int len)
{
if(len + ( - d)*ivs[] >= ans ) return;
for(int i = ; i < SZ; i++){
int iv = ivs[i];
bool ok = true;
for(int j = ; j < N; j++) {
if((pre[j]>>iv)&tab[j]) { ok = false; break;}
}
if(ok) {
if(d == ) {
ans = std::min(ans,len+iv);
return ;
}
int now[N];
for(int j = ; j < N; j++) {
now[j] = (pre[j] >> iv) | tab[j];
}
dfs(d+,now,len+iv);
}
}
} void preJudge(int n)
{
SZ = ;
for(int iv = ; iv <= n; iv++){
bool ok = true;
for(int i = ; i < N; i++) {
if((tab[i]>>iv)&tab[i]) { ok = false; break;}
}
if(ok) ivs[SZ++] = iv;
}
} int main()
{
#ifdef local
freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
#endif // local
int n;
char G[maxn+];
while(~scanf("%d",&n)&&n) { memset(tab,,sizeof(tab));
for(int i = ; i < N; i++){
scanf("%s",G);
for(int j = ; j < n; j++) if(G[j] == 'X'){
tab[i] |= <<j;
}
}
ans = n*;
preJudge(n);
dfs(,tab,n);
printf("%d\n",ans);
}
return ;
}

最新文章

  1. 转载利用伪元素单个颜色实现 hover 和 active 时的明暗变化效果
  2. VC工程中文件的编译顺序
  3. 微信公共平台开发-(.net实现)2--ACCESSTOKEN值获得
  4. Oracle执行语句跟踪(1)——使用sql trace实现语句追踪
  5. WCF编程系列(四)配置文件
  6. Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建
  7. java ssh框架入门
  8. sqlserver自学笔记之的流程控制语句
  9. Oracle单表的复杂查询
  10. SerialPort如何读取串口数据并显示在TextBox上,多线程委托
  11. JRockit检测Tomcat内存溢出JAVA内存泄漏问题
  12. IntelliJ IDEA 编译Java程序出现 &#39;Error:java: 无效的源发行版: 9&#39; 的解决方案
  13. Java学习:注解,反射,动态编译
  14. Node.js Error: listen EADDRNOTAVAIL
  15. Sereja and Two Sequences CodeForces - 425C (dp)
  16. highcharts,highStock 中文图表配置
  17. k8s之安装docker-ce17.06
  18. 基于zookeeper的主备切换方法
  19. 第五章 JVM垃圾收集器(1)
  20. nltk30_Investigating bias with NLTK

热门文章

  1. matlab新手入门(三)(翻译)
  2. Json文件转Excel
  3. Hyperledger Fabric 替换couchDB
  4. Candies
  5. Python小世界:彻底搞懂Python一切皆对象!!!
  6. 一个线性表中的元素为整数,设计一个算法,将正整数和负整数分开,使线性表的前一半为负整数,后一半为正整数。(C语言)
  7. 题解 [HNOI2002]DNA分子的最佳比对 (洛谷P2268)
  8. 牛客假日团队赛2 F.跳跃
  9. Codeforces 1167F(计算贡献)
  10. 【手撸一个ORM】第六步、对象表达式解析和Select表达式解析