做题小结 dp训练4

news/2024/11/17 1:42:02/文章来源:https://www.cnblogs.com/LteShuai/p/18351586

第一个

我按dp找 结果是个二分 我还想半天 这怎么dp
不过 这题目 也很有意义

首先我一直以为vector的low或者upp下标只能用distance求
现在看来是错的 不要再写auto 迭代器写法 用int就行 减初始指针就行

然后二分的话 思路也很好

先存进去 然后在跑t的时候 先开一个指针 然后对于一个字符判断当前指针与他的下标对比 发现够用更新指针 不够用ans++ 更新指针即可
非常好的一道二分

树形dp

这是我自己想出来的 ac了感觉很开心
首先这是一颗二叉树

然后思考dp如何建立

对于一个节点而言
如果他有两个孩子 那么我们要算出他和孩子的总数
还要算出最大儿子子树的数量 还要算出如果切这个枝条那他的贡献(记住-1)
一个孩子的话 没得选
所以我们开二维表示

//0 自己子树的所有节点数  
//1 表示其中某个节点的最大儿子数   
//2 表示选择了一颗子树后,
//另一颗子树选了其中一颗最大子树后的值 dp[u][0]=1;dp[u][1]=0;dp[u][2]=0;for(auto v:e[u]){if(v==fa)continue;dfs(v,u);dp[u][0]+=dp[v][0];dp[u][1]=max(dp[u][1],dp[v][0]);//删的是u 不是儿子 		}

下面就开始分析孩子 一个孩子的话 就只好选下去了

	int w;if(u==1)w=e[u].size();else  w=e[u].size()-1;if(w==1){int one=0;for(auto i:e[u]){if(i!=fa)one =i;}dp[u][2]=dp[one][0]-1;}

这边细节蛮多的

	if(i!=fa)one =i;一开始没想到 后面看答案有问题才调出来 

两个的

	else if(w==2){int one=0,two=0;for(auto i:e[u]){if(i!=fa&&!one)one=i;else if(i!=fa&&one)two=i;}
感觉自己太牛逼了 if(dp[one][0]+dp[two][2]>dp[two][0]+dp[one][2]){dp[u][2]=dp[one][0]+dp[two][2]-1;}else {dp[u][2]=dp[two][0]+dp[one][2]-1;}}	

压轴登场

神题

首先给出我的思路 我开了个三维dp
二维表示此时a选的 三维表示此时b选的
发现要4个for循环吧 反正肯定要超时 然后我也没想优化
主要是脑子也没优化的概念 看了题解才知道可以优化

		for (jt=1;jt<=n;jt++)for (j2=n;j2>=jt;j2--)for (j3=1;j3<=jt;j3++)for (j4=max(j3,j2);j4<=n;j4++)f[i][jt][j2]+=f[i-1][j3][j4];

那么我们该怎么优化呢 我们可以使用二维前缀和的思想
我们令sum[n][i][j]表示小于等于i 大于等于j的所有方案
那么可以怎么转移呢 很明显 我们可以由i-1 j ,i j+1 转移过来
其实二维前缀和转移 为什么j+1是因为我们毕竟算大于等于j
和j-1无关 然后你会发现重复了一段 i-1 j+1 因为二者都包含了这个
所以减去 然后呢 我们还要加上此前就有的n-1 i j 因为可以等于嘛

提前预处理1的值 后续转移要用

cin>>n>>m;for(int i=1;i<=n;i++){		for(int j=n;j>=i;j--){//i是a j是b j必须大于ie[1][i][j]=(e[1][i-1][j]+e[1][i][j+1]+mod-e[1][i-1][j+1]+1+mod)%mod;//二维前缀和 dp[1][i][j]=1;	//n=1 就不怕了 		}}for(int i=2;i<=m;i++){for(int j=1;j<=n;j++){for(int k=n;k>=j;k--){//这一步很重要dp[i][j][k]=e[i-1][j][k];e[i][j][k]=(((e[i][j-1][k]+e[i][j][k+1])%mod-e[i][j-1][k+1]+mod)%mod+e[i-1][j][k]+mod)%mod;	
要累加 所以是i	  }}}int ans=0;for(int i=1;i<=n;i++){for(int j=n;j>=i;j--){ans=(ans+dp[m][i][j])%mod;}}cout<<ans<<endl;

第二种 固定长度不下降序列的写法
可以观察到其实就是一个

写要怎么写呢
先m*2
dp数组表示第i位以j结尾
加上选j 那么j-1我们是要知道 j也是要知道

所以开一个sum记录 i-1以j结尾的 i-1以j结尾的答案 当然此时dp是等于
i-1 j-1 因为此时选的j嘛 不过sum要加上去 毕竟是前缀和

int n;int m;
int a[range];
int mod=1e9+7;
int dp[1005][1005];
int sum[1005][1005];
void solve()
{ //open my eyes in morning rain//Clouds are slowly drifting by who is crying under the skycin>>n>>m;m=2*m;sum[0][0]=1;int ans=0;for(int i=1;i<=n;i++){dp[1][i]=1;sum[1][i]=sum[1][i-1]+1;}for(int i=2;i<=m;i++){for(int j=1;j<=n;j++){			dp[i][j]=sum[i-1][j];//i-1以j结尾 sum[i][j]=(dp[i][j]+sum[i][j-1])%mod;//表示i位时所有小于等于j的方案数 }}//跟我第一个写法好像啊 这个写法 不过更简便了 
//	cout<<m<<endl;for(int i=1;i<=n;i++){
//	 cout<<dp[m][i]<<endl;ans=(ans+dp[m][i])%mod;}	cout<<ans<<endl;
}

写完了 休息下吧

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

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

相关文章

Modbus_RTU

本文主要记录串口通信,主要记录 modbus 的默认通信协议 modbus_RTU,当然modbus还包含 modbus_TCP(网口)和 modbus_ASCII(串口)。 一、基础知识 串口和网口串口:串口是一种物理接口,通常用于连接计算机和外部设备,如打印机、鼠标等。它使用一根线缆进行数据传输,常见的…

异步FIFO设计

Asynchronous FIFO Design总结来自Clifford E. Cummings论文 《Simulation and Synthesis Techniques for Asynchronous FIFO Design》一、设计难点使用格雷码计数时空和满的判断。 同步FIFO读写时钟相同,而异步FIFO读写来自不同两个读写时钟,需要考虑跨时钟域设计。二、设计…

常量的基础认知和相互转化

常量:在java程序运行过程中,其值不能够发送改变的量 分类:字面值常量:字符串常量:被双引号括起来的字符序列 "java"字符常量:被单引号括起来的单个字符 a整数常量:所有的整数 100 200 -100小数常量:所有的小数 1.23 3.14 -1.23布尔常量:true false空常…

.NET 窗口/屏幕录制

窗口/屏幕截图适用于截图、批注等工具场景,时时获取窗口/屏幕图像数据流呢,下面讲下视频会议共享桌面、远程桌面这些场景是如何实现画面录制的。 常见的屏幕画面时时采集方案,主要有GDI、WGC、DXGI。 GDI GDI(Graphics Device Interface)就是使用user32下WindowsAPI来实现…

.NET 屏幕录制

窗口/屏幕截图适用于截图、批注等工具场景,时时获取窗口/屏幕图像数据流呢,下面讲下视频会议共享桌面、远程桌面这些场景是如何实现画面录制的。 常见的屏幕画面时时采集方案,主要有GDI、WGC、DXGI。 GDI GDI(Graphics Device Interface)就是使用user32下WindowsAPI来实现…

Kubernetes-POD的QoS

目录背景问题分析进一步排查问题原因Pod的QoS服务质量等级结论 背景 今天开发团队反馈,测试环境中部分业务功能无法正常使用。经过初步排查,发现某个业务Pod在一天内重启了10次,因此需要进一步调查原因。 问题分析 首先,我查看了Pod的日志,发现JVM并未抛出任何错误,服务却…

2024.8.9 鲜花

几张图?推歌:早安大森林 ![](https://baike.baidu.com/pic/%E6%97%A9%E5%AE%89%E5%A4%A7%E6%A3%AE%E6%9E%97/64160919/1/b17eca8065380cd791236bebf51cba345982b2b72b26?fr=lemma&fromModule=lemma_content-image#aid=1&pic=b17eca8065380cd791236bebf51cba345982b2…

赋值运算符和+号的用法(两个练习)

string strName = "kakaxi";string strVillage = "huoyingcun";int iAge = 20;string strEmail = "1287195315@qq.com";decimal deSalary = 2000m;Console.WriteLine("大家好,我叫{0},我今年{1}岁了, 我住在{2},我的邮箱是{3}, 我的工资有足…

中国四大软件外包公司

今天我们来聊聊国内的四大软件外包公司。这些公司不仅在国内市场中占据重要地位,还对全球软件外包行业产生了影响。部分数据来源网络排名,按照职位量、增长速度排名,排名仅供参考,去某家公司一定要多方位参考,比如企查查、脉脉等。要说软件外包这块大蛋糕,谁不想来一口呢…

六、决策树

决策1:如何选择在每个节点上分割什么特征?最大限度地提高纯度(或最小限度地减少不纯)。决策2:什么时候停止拆分?当一个节点是一个单一类时 当拆分一个节点会导致树超过最大的深度 当纯度分数的改进低于一个阈值(获得的信息增益很小小于阈值) 当一个节点中的例子数量低于…

性能测试面试题大曝光,让你如何迅速拿下 offer!

性能测试面试题精选1、 以前做过性能测试么?请结合例子具体说明性能测试的流程 面试考察点:性能测试的流程首选做性能测试的需求分析,明确性能测试的目标、范围、场景和性能指标(如响应时间、吞吐量、并发用户数等)。测试性能测试环境搭建:搭建与生产环境尽可能一致的测试…

[Java并发]ThreadLocal补充

ThreadLocal缺点及解决方案 每个Thread上都有一个threadLocals属性,它是一个ThreadLocalMap,里面存放着一个Entry数组,key是ThreadLocal类型的弱引用,value是对用的值。所有的操作都是基于这个ThreadLocalMap操作的。 但是它有一个局限性,就是不能在父子线程之间传递。 即…