2025/2/22课堂记录

news/2025/3/1 22:08:46/文章来源:https://www.cnblogs.com/yongshao/p/18731475

目录

  1. 愚蠢的矿工
  2. 国王(猛兽军团)

  • 愚蠢的矿工

这网页稍微有点乱,不过凑合凑合还能看,就是没法提交了而已

首先看到的第一眼,感觉是树上依赖背包

毕竟要挖到某一个节点的宝藏要之前知道根节点所有节点都要有狗狗停留

但是呢……

没错,他就是树上依赖背包(别打我)

但是呢,这道题还有第二种写法,就是多叉树转二叉树

没错,左牵儿子,右擎兄弟的孩子兄弟表示法

记住一个口诀:之前你的儿子现在是我的兄弟,现在你的儿子是我 

然后就可以根据普通的树形dp来做啦

这是代码

#include<iostream>
#include<cstring>
using namespace std;
int a[1010],leftt[1010],rightt[1010],vis[1010][110];
int dp(int x,int m)//dp(a,b):求以a为根节点的子树,给b位矿工,求最大值,也就是vis[a][b] 
{if(m==0)return 0;//不给人没法干活if(vis[x][m]!=-1)return vis[x][m];//之前算过这个,剪枝if(x==-1)return 0;//访问的节点不存在,sorry,the number you…int ans=0;//终于剪完枝了 ans=dp(rightt[x],m);//自己没留人,孩子不能走。把所有人手都给自己的兄弟for(int i=0;i<=m-1;i++)//至少给自己留一人,然后就可以走孩子了,孩子兄弟分家产ans=max(ans,dp(leftt[x],i)+a[x]+dp(rightt[x],m-i-1));//别忘了数你自己! vis[x][m]=ans;return ans; 
}
int main()
{memset(vis,-1,sizeof(vis));int n,m;cin>>n>>m;//宝藏个数;旷工人数for(int i=1;i<=n;i++) cin>>a[i];for(int i=0;i<=n;i++)leftt[i]=rightt[i]=-1;for(int i=1;i<=n;i++){int x,y;cin>>x>>y;rightt[y]=leftt[x];//之前你的儿子现在是我的兄弟leftt[x]=y;//现在你的儿子是我 }cout<<dp(leftt[0],m); //0的孩子就是树根 cout<<"\n";for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)cout<<vis[i][j]<<" ";cout<<"\n";}return 0;
}

  • 国王(猛兽军团)

这是一个全新的dp种类,名叫“状压”

状压就是列数比较少的,行数不限的dp,每行可以用二进制等进行描述

前面预处理部分是筛选出所有合法状态,然后把二进制压缩(所以行数必须要少,不然数据的大小是呈指数型增长的!!)

比如10110这个

010110

&       101100

——————

          000100

所以就有重叠

后来通过4for:枚举行,个数,方案,前一行方案来进行dp

 

// 猛兽军团1; 互不侵犯
// <<算法竞赛宝典-第二部>>
// N*N  放m个猛兽  上下左右,四条对角线; 共8个方向冲突;
#include<iostream>
using namespace std;
int n,m,ans; 
int s[1050] ;//保存一行之内不冲突的可行状态
int state;   //统计行内可行状态的个数
int num[1050];//对应可行状态的猛兽个数;
int f[11][105][1050];// f[i][j][s]: 前i行放j个猛兽,并且第i行放置第s个可行状态; 
int main()
{cin>>n>>m;//预处理部分 : 找出行内不冲突的可行状态; for(int i=0;i<(1<<n);i++){if(i&i<<1)    // 状态s里面有相邻的1 ,冲突 continue;state++;   s[state]=i;int t=i;while(t){num[state]+=t&1;t=t>>1;   // t=t/2;}}//dp部分;//第一行 for(int i=1;i<=state;i++){int j=num[i];if(j>m)continue;f[1][j][i]=1;  //前1行放置j个猛兽,并且第1行放第i个合法状态的  方案数 }//2-n行  4for: for(int i=2;i<=n;i++)  // 枚举到第i行 {for(int j=0;j<=m;j++) // 1~i行放置j个猛兽 {for(int a=1;a<=state;a++)   // 当前行可行状态{int x=num[a];//第1行放置的猛兽个数 if(x>j)continue;int xx=j-x;               //1~i-1行剩余可用的猛兽数 for(int b=1;b<=state;b++) //第i-1行可行状态{int y=num[b];if(y>xx)continue;if(s[a]&s[b])     //同列 continue;if(s[a]<<1&s[b])  //左上角 continue;if(s[a]&s[b]<<1)  //右上角 continue;f[i][j][a]+=f[i-1][j-num[a]][b];} if(i==n&&j==m)ans+=f[n][m][a]; }}	} cout<<ans<<endl;return 0;
} 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/891717.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Azure Storage Account】利用App Service作为反向代理, 并使用.NET Storage Account SDK实现上传/下载操作

问题描述 在使用Azure上的存储服务 Storage Account 的时候,有时需要代替 它原本提供的域名进行访问,比如默认的域名为:mystorageaccount.blob.core.chinacloudapi.cn, 想转变为 myservice.file.com 。如果使用App Service作为反向代理,我们现在有如下三个疑问: 第一:如…

大胆点!你猜DeepSeek的利润率有多高?

这种一周真是热闹啊,DeepSeek开源周,连续五天(2025年2月24日至28日)开源了5个核心技术项目,覆盖AI模型训练、推理优化、文件系统等多个领域,在今天还放出来了One more thing,直接把自己的利润率放出来了(真不拿用户当外人,哈哈) 接下来让我们一起来看看开源周都带来了…

通过网盘分享的文件:Oracle Database 12c linux版本 安装包

https://pan.baidu.com/s/14n1el1C0v1kbaHpDkw9i6w?pwd=1234 提取码: 1234

CountDownLatch的countDown()方法的底层源码

一、CountDownLatch的构造方法// 创建倒数闩,设置倒数的总数State的值CountDownLatch doneSignal = new CountDownLatch(N);二、countDown() 方法的作用 countDown() 方法的主要作用是将 CountDownLatch 的内部计数器减一。如果计数器减到零,则会唤醒所有等待的线程 三、coun…

论文+1

1.2 研究目标本研究旨在解决微服务架构中质量属性冲突和评估方法缺失的问题。具体目标如下:构建可量化的质量属性评估指标体系:通过深入分析微服务架构的特点和业务需求,明确性能、可用性、安全性等关键质量属性的量化指标,为后续的评估和优化提供准确的数据支持。 设计基于…

2.28 AI课堂训练测试

老师要求我们用指令训练Ai完成我们开学测试的代码,锻炼我们的业务逻辑 开学测试要求:请设计一个仓储管理系统原型系统,该系统支持多个仓库的设立。统一设立物资台账,物资台账需包含物资编码、物资名称、规格、材质、供应商、品牌、物资分类,用户可以自定义物资的物资分类。…

Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!

Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来! 1. 优势介绍 Obsidian 是一款强大的本地知识管理软件,它像一个积木盒,让你用 Markdown 笔记搭建自己的知识宇宙。通过 双链笔记,你可以将不同的想法、灵感和信息连接起来,构建一个属于你自己的知识网络…

idea创建Spark项目报错记录

报错1:SparkException: A master URL must be set in your configuration解决方案:添加conf.setMaster("local"); local[“*”]中代表的是有几个线程,如果只写local就是单线程,如果是local[2]就是两个线程package com.fyq.spark.rdd;import org.apache.spark.Sp…

14.4.2 训练

首先来看看二元交叉熵的损失公式然后再来看看nn.functional.binary_cross_entropy_with_logits的用法然后来讲一下\(0.9352\)是怎么得出的(\(1.8462\)同理)每个样本没有归一化的输出为[1.1, -2.2, 3.3, -4.4],标签分别为[1.0, 0.0, 0.0, 0.0] 将这四个样本代入最开始给的二元…