题外话:

是非常颓废的博主

写题解也不在于能不能通过啦,主要是缓解颓废

首先看到这个题,肯定是可以暴力搜索的:

不得不说这道题还是很善良的,一波大暴力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]奶牛混合起来的更多相关文章

  1. 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 & ...

  2. 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告

    P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题意: 给定一个长\(N\)的序列,求满足任意两个相邻元素之间的绝对值之差不超过\(K\)的这个序列的排列有多少个? 范围: ...

  3. 洛谷P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

    P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a u ...

  4. 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

    P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a u ...

  5. P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows

    题目描述 约翰家有N头奶牛,第i头奶牛的编号是Si,每头奶牛的编号都是唯一的.这些奶牛最近 在闹脾气,为表达不满的情绪,她们在挤奶的时候一定要排成混乱的队伍.在一只混乱的队 伍中,相邻奶牛的编号之差均 ...

  6. 洛谷P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 状压动归

    考场上空间开大了一倍就爆0了QAQ- Code: #include<cstdio> #include<algorithm> #include<cmath> usin ...

  7. 洛谷 P2915 【[USACO08NOV]奶牛混合起来Mixed Up Cows】

    类似于n皇后的思想,只要把dfs表示放置情况的数字压缩成一个整数,就能实现记忆化搜索了. 一些有关集合的操作: {i}在集合S内:S&(1<<i)==1: 将{i}加入集合S:S= ...

  8. [USACO08NOV]奶牛混合起来Mixed Up Cows

    题目描述 Each of Farmer John's N (4 <= N <= 16) cows has a unique serial number S_i (1 <= S_i & ...

  9. 【[USACO08NOV]奶牛混合起来Mixed Up Cows】

    首先我们能够一眼看到4 <= N <= 16,那么就是它了,我们要压缩的状态就是它了 那么之后能我们用这个状态表示什么呢,我们要表示的显然是每只奶牛是否在队伍中 比如说10吧,转成二进制后 ...

随机推荐

  1. JS 跳转后保持当前参数

    跳转 var data = str+"&jc=0"+ "&data=" + $("form").serialize().re ...

  2. sh_03_列表的数据统计

    sh_03_列表的数据统计 name_list = ["张三", "李四", "王五", "王小二", "张三 ...

  3. python3.6+selnium3+IE11问题及解决方法

    环境:python3.6+selnium3+IE11+win7 一.输入框输入字符很慢,大概5秒输入一个字符 解决方法:把IEDriverServer.exe替换成32位的 二.用例异常后不继续执行剩 ...

  4. ctf活动结果

    签到题:flag{0ca175b9c0f726831d895e269332461} 解题过程:使用winhex打开图片,查询到ANSI ASCII 得到结果 1.SimCTF{hello simple ...

  5. WebSocket 结合 Nginx 实现域名及 WSS 协议访问-Nginx配置

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  6. SQL Server2016 AlwaysOn无域高可用

    https://blog.csdn.net/qq_41981651/article/details/90314817 https://blog.csdn.net/roven257/article/de ...

  7. [Java]使用正则表达式实现分词

    手工分词稍嫌麻烦,不好维护,而利用正则表达式就利索多了.Java提供了java.util.regex.Matcher,java.util.regex.Pattern类来帮助我们实现此功能. 例一:以下 ...

  8. Jmeter(七)参数化

    初识Jmeter的时候, 除了感觉安装和配置都很轻量以外, 还有一个最大的感触就是, 翻译真硬啊, 真的够够的! 和他磨合了挺长一段时间之后, 终于开悟了, 这些硬硬的翻译, 其实还是基本靠谱的, 看 ...

  9. iOS 图表工具charts之CombinedChartView

    关于charts的系列视图介绍传送门: iOS 图表工具charts介绍 iOS 图表工具charts之LineChartView iOS 图表工具charts之BarChartView iOS 图表 ...

  10. SQLServer 断开指定会话

    方法1: SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT [DBID] FROM [Master].[dbo] ...