Luogu P2915 [USACO08NOV]奶牛混合起来
题外话:
是非常颓废的博主
写题解也不在于能不能通过啦,主要是缓解颓废
首先看到这个题,肯定是可以暴力搜索的:
不得不说这道题还是很善良的,一波大暴力dfs,居然有70pts:
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int ans=0;
char last=' ',ch=getchar();
while(ch>'9'||ch<'0') last=ch,ch=getchar();
while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar();
if(last=='-') ans=-ans;
return ans;
}
int n,k;
int s[20];
long long ans;
bool vis[20];
void dfs(int cnt,int nxt) {
if(cnt==n) {
ans++;
return;
}
for(int i=1;i<=n;i++) {
if(vis[i]) continue;
if(abs(s[i]-nxt)>k) {
vis[i]=1;
dfs(cnt+1,s[i]);
vis[i]=0;
}
}
}
int main() {
n=read();
k=read();
for(int i=1;i<=n;i++)
s[i]=read();
dfs(0,-k-1);
printf("%lld",ans);
return 0;
}
想改记忆化,然后我发现我不会
滚回来重新考虑dp:
将奶牛状压到一个二进制数中,第i位表示这头奶牛是否在队伍中;(突兀
我们设 \(dp[i][j]\) 表示当前状态为i,最后一个加入队伍的奶牛是j的方案数;
考虑如何转移:
设现在的状态为 \(dp[i][j]\)
考虑枚举下一个加入队伍的奶牛g是哪一只,那么首先肯定要满足的,就是这只奶牛不能已经加入队伍了 (奶牛:我有分身术 也就是i&(1<<(g-1))==0
1.如果已经在队伍里,显然要continue;(废话
2.如果不在队伍里,那么判断第g头奶牛和第j头奶牛之间的编号之差是否>k,同样的不是就continue掉 (同样的废话
如果上面两个条件都满足,那么就可以将g加入队伍,对应的状态 \(dp[i|(1<<(g-1))][g]+=dp[i][j];\)
考虑初始化:
对于只有一头奶牛的情况,显然只有一种方案,因此 \(dp[1<<(i-1)][i]=1;\)
然后因为上面讲的 非常非常之乱,咱们来理一理思路:
首先显然是初始化,将只有一头奶牛的方案的值初始化为1
接下来枚举每一种状态
第二维枚举当前状态下,最后一个加入队伍的奶牛j是哪一只(可以直接从1~n枚举,用i&(1<<(j-1))!=0来判断合法与否
然后枚举下一头加入队伍的奶牛是哪一头,判断是否符合上面的两个条件,相应的进行修改
最后显然是输出答案啦:显然最后的答案应该是所有奶牛都加入了队伍,每一头奶牛最后进入队伍的方案数相加,也就是 \(\sum\limits_{i=1}^n dp[(1<<n)-1][i]\)
然后,大概应该可能就可以愉快的AC了?(是 码风清奇的奇女子,将就着看吧
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int ans=0;
char last=' ',ch=getchar();
while(ch>'9'||ch<'0') last=ch,ch=getchar();
while(ch>='0'&&ch<='9') ans=(ans<<1)+(ans<<3)+ch-'0',ch=getchar();
if(last=='-') ans=-ans;
return ans;
}
int n,k;
int s[20];
long long ans;
long long dp[70000][18];
int main() {
n=read();
k=read();
for(int i=1;i<=n;i++)
s[i]=read();
for(int i=1;i<=n;i++)
dp[1<<(i-1)][i]=1;
for(int a=1;a<(1<<n);a++) {
for(int j=1;j<=n;j++) {
if(!(a&(1<<(j-1))))
continue;
for(int g=1;g<=n;g++) {
if((a&(1<<(g-1))))
continue;
if(abs(s[j]-s[g])<=k)
continue;
dp[a|(1<<(g-1))][g]+=dp[a][j];
}
}
}
for(int i=1;i<=n;i++)
ans+=dp[(1<<n)-1][i];
printf("%lld\n",ans);
return 0;
}
//一堆括号看的我眼疼
Luogu P2915 [USACO08NOV]奶牛混合起来的更多相关文章
- luogu P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i & ...
- 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题意: 给定一个长\(N\)的序列,求满足任意两个相邻元素之间的绝对值之差不超过\(K\)的这个序列的排列有多少个? 范围: ...
- 洛谷P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a u ...
- 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a u ...
- P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
题目描述 约翰家有N头奶牛,第i头奶牛的编号是Si,每头奶牛的编号都是唯一的.这些奶牛最近 在闹脾气,为表达不满的情绪,她们在挤奶的时候一定要排成混乱的队伍.在一只混乱的队 伍中,相邻奶牛的编号之差均 ...
- 洛谷P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 状压动归
考场上空间开大了一倍就爆0了QAQ- Code: #include<cstdio> #include<algorithm> #include<cmath> usin ...
- 洛谷 P2915 【[USACO08NOV]奶牛混合起来Mixed Up Cows】
类似于n皇后的思想,只要把dfs表示放置情况的数字压缩成一个整数,就能实现记忆化搜索了. 一些有关集合的操作: {i}在集合S内:S&(1<<i)==1: 将{i}加入集合S:S= ...
- [USACO08NOV]奶牛混合起来Mixed Up Cows
题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i & ...
- 【[USACO08NOV]奶牛混合起来Mixed Up Cows】
首先我们能够一眼看到4 <= N <= 16,那么就是它了,我们要压缩的状态就是它了 那么之后能我们用这个状态表示什么呢,我们要表示的显然是每只奶牛是否在队伍中 比如说10吧,转成二进制后 ...
随机推荐
- SSM框架搭建,以及mybatis学习
前两天在研究SSM框架,然后看到一篇博文,写的很清晰,照着实现了一下,这里就不重复写了,把博文地址留一下 http://blog.csdn.net/zhshulin/article/details/3 ...
- 关于多个py文件生成一个可运行exe文件(用pyinstaller)
首先下载Pyinstaller,在cmd命令下执行:pip installer Pyinstaller,不需要关心安装在哪 然后把所有相关的py文件都放在一个目录下 在那个目录下执行cmd命令:pyi ...
- G.subsequence 1(dp + 排列组合)
subsequence 1 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 You are ...
- What’s up with the Graph Laplacian
What's up with the Graph Laplacian? 来源 作者:Jeremy Kun blog: Math ∩ Programming 在数学上图和与图关联的某些矩阵的代数性质有很 ...
- 一个困扰很久的异常—java.lang.NoClassDefFoundError: com/google/gson/Gson
描述: 这个异常是在运行时抛出的,编译的时候没有任何问题,而且异常信息非常少,只有一句:java.lang.NoClassDefFoundError: com/google/gson/Gson 解决: ...
- HTML和CSS 入门系列(二):文字、表单、表格、浮动、定位、框架布局、SEO
上一篇:HTML和CSS 入门系列(一):超链接.选择器.颜色.盒模式.DIV布局.图片 一.文字 1.1 属性 1.2 字体样式:font-family 1.3 字体大小:font-size 1.4 ...
- 文件和Stream
I/O和文件 输入/输出(I/O)就是在内存和外部设备之间复制数据的过程.输入(input)就是从I/O设备复制数据到内存,输出(output)就是从内存复制数据到I/O设备. 一个文件可以理解成一串 ...
- Mysql和Orcale的区别
有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到ORAC ...
- 第七周总结&第五次实验报告
学习总结 这周我们加深了对抽象类与接口的学习,获得的知识点也比上周多了许多,抽象类与接口很相似,就比如别人还没有做完的是交给你来做,而他那些样式都做好了,你只需要完善即可 但也有不同点. 区别点 抽象 ...
- linux 加多播协议(IGMP)
可能你所用的内核编译时没有选中multicast的选项. 追问 感谢您的回复,但是我还是不太明白你说的multicast选项是什么意思.能更详细的说一下吗,谢谢.或者能直接用QQ或者MSN帮忙看看 ...