IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 状压dp 混乱的奶牛(有点裸) -> 正文阅读

[数据结构与算法]状压dp 混乱的奶牛(有点裸)

链接:登录—专业IT笔试面试备考平台_牛客网
混乱的奶牛 [Don Piele, 2007] Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 <= S_i <= 25,000). 奶牛为她们的编号感到骄傲, 所以每一头奶牛都把她的编号刻在一个金牌上, 并且把金牌挂在她们宽大的脖子上. 奶牛们对在挤奶的时候被排成一支”混乱”的队伍非常反感. 如果一个队伍里任意两头相邻的奶牛的编号相差超过K (1 <= K <= 3400), 它就被称为是混乱的. 比如说,当N = 6, K = 1时, 1, 3, 5, 2, 6, 4 就是一支”混乱”的队伍, 但是 1, 3, 6, 5, 2, 4 不是(因为5和6只相差1). 那么, 有多少种能够使奶牛排成”混乱”的队伍的方案呢?

其实这个有点类似于TSP的思路,都是通过枚举当前和上一次的点来进行递推。

(话说这个题的状压也许并不是那么好想?)

思路:数据范围不大,应该说是异常的小,一般这种东西就应该往类似状压或者暴力的方向上去想了。

dp[i][j]:状态为j且队尾为i的情况下可行的方案数 ;

下一步考虑初始化:很明显应该在只放一头牛的情况下进行初始化,对于任意一头牛,它第一个放进去的时候,它就是队尾,并且此时可行数也只有1(毕竟只能放一头);

for(int i=1;i<=n;++i) dp[i][1<<(i-1)]=1; //初始化 

然后枚举所有状态,在所有可能的状态中,先任选一个已经被标为1(也就是已经在队伍里的牛)作为队尾,找到队尾后,再在标记为0(也就是还没进队)的牛中选一个插进来,如果这两头牛的编号满足要求(差的绝对值大于要求),这就是一个可行的方案了。

最后的状态一定是全为1的情况,那么把每头牛作为队尾的情况对应的方法数加起来就是了。

(如果想到状压的话还是比较裸的)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,s;
ll mas[20];
ll dp[20][(1<<18)+10];//状态为j且队尾为i的情况下可行的方案数 
int main()
{
	cin>>n>>s;
	for(int i=1;i<=n;++i) cin>>mas[i];
	for(int i=1;i<=n;++i) dp[i][1<<(i-1)]=1; //初始化 
    for(ll i=0;i<(1<<n);++i){
    	for(int j=1;j<=n;++j){
    		if(i&(1<<(j-1))){
    			for(int k=1;k<=n;++k){
    				if((i&(1<<(k-1)))) continue;
					if(abs(mas[j]-mas[k])<=s) continue;
					dp[k][i+(1<<(k-1))]+=dp[j][i];
				}
			}
		}
	}
	ll ans=0;
	for(int i=1;i<=n;++i){
	ans+=dp[i][(1<<n)-1];	
	}
	cout<<ans<<endl;
	return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:44:08  更:2021-12-24 18:46:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:47:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码