[BZOJ1659][Usaco2006 Mar]Lights Out 关灯
2015-10-05 12:18
344 查看
原题地址
迭代加深搜索,从小到大枚举剩余灯泡数,然后用这个剪枝.
Mektpoy神犇的题解
把字典序最大看成最小怒WA了两发,没救了…
AC code:
迭代加深搜索,从小到大枚举剩余灯泡数,然后用这个剪枝.
Mektpoy神犇的题解
把字典序最大看成最小怒WA了两发,没救了…
AC code:
#include <cstdio> const int N=51; const int INF=1<<30; int n,m,lo,la=INF; int a ,b ,opt ,ans ; void update(){ if(lo>la) return ; if(lo==la){ for(int i=1;i<=n;i++){ if(opt[i]>ans[i]) break; if(opt[i]<ans[i]) return ; } } la=lo; for(int i=1;i<=la;i++) ans[i]=opt[i]; } bool DFS(int cnt,int pos,int k){ if(cnt>k) return 0; if(pos+m-1>n){ for(int i=pos;i<=n;i++) cnt+=a[i]; if(cnt>k) return 0; update(); return 1; } bool flag=0; flag|=DFS(cnt+a[pos],pos+1,k); opt[++lo]=pos; for(int i=1;i<=m;i++) a[pos+i-1]^=b[i]; flag|=DFS(cnt+a[pos],pos+1,k); lo--; for(int i=1;i<=m;i++) a[pos+i-1]^=b[i]; return flag; } int main(){ scanf("%d%d\n",&n,&m); for(int i=1;i<=n;i++){ char t; scanf("%c",&t); a[i]=t-'0'; } scanf("\n"); for(int i=1;i<=m;i++){ char t; scanf("%c",&t); b[i]=t-'0'; } for(int i=0;i<=n;i++) if(DFS(0,1,i)) break; printf("%d\n",la); for(int i=1;i<=la;i++) printf("%d\n",ans[i]); return 0; }
相关文章推荐
- Git远程操作详解
- Remove Linked List Elements
- Leetcode NO.274 H-Index
- linux awk
- AndroidUI的组成部分ProgressBar
- 结对编程
- 电脑DOS命令 查看端口
- 谁是云的王者?OpenStack与VMware优劣对比
- leetcode 118 Pascal's Triangle(难易度:Easy)
- 求子串的KMP算法
- 闲来无事,学着用C#写邮箱助手、群发小工具
- 单例(一)
- Operating System: Three Easy Pieces --- API (Note)
- 端口状态说明 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT
- Julia: 用Julia操作Redis数据库及一些用法
- dfs递归过程代码优化
- 两个栈实现队列(完整理解)
- 对象只能建立在栈上(堆上)
- java Exception RuntimeException
- DataKit CrossManager 2015.4 Win32_64 1CD