【算法每日一练]-动态规划 (保姆级教程 篇15) #纸带 #围栏木桩 #四柱河内塔

目录

今日知识点:

计算最长子序列的方案个数,类似最短路径个数问题

四柱河内塔问题:dp[i]=min{ (p[i-k]+f[k])+dp[i-k] } 

纸带

围栏木桩

 四柱河内塔


        

        
纸带

思路:

我们先设置dp[i]表示从i到n的方案数。

那么减法操作中:i可以移动到[1,i-1]中的任意一个格子。反过来可以认为:i可以从i+1到n转移过来。所以得出dp[i]=dp[i+1]+…dp[n];(使用后缀和即可)

然后除法操作中:i可以移动到[1,i/2]中的任意一个格子。反过来可以认为:i可以从x/2==i的任意x移动过来。所以得出dp[i]+=sum[i*j]-sum[i*j+j](i*j<=n)

#include <bits/stdc++.h>
using namespace std;
const int N=4e6+5;
int n,mod,dp[N],sum[N];int main(){cin>>n>>mod;dp[n]=sum[n]=1;for(int i=n-1;i>=1;i--){dp[i]=sum[i+1];//减法for(int j=2;j*i<=n;j++){//除法int r=min(n,i*j+j-1);dp[i]=(dp[i]+sum[i*j]-sum[r+1])%mod;}sum[i]=(sum[i+1]+dp[i])%mod;}	cout<<dp[1];
}

        

         

围栏木桩

 输入:
3
9 10 1 9 8 7 6 3 4 6
3 100 70 102
6 40 37 23 89 91 12

思路:

其实就是先找最长上升子序列,然后再求有多少个最长的上升子序列。

首先设置dp[i]表示以i结尾的最长上升子序列。

转移:(i能拼在j后面的话)dp[i]=max(dp[j])+1;

那么要求有多少个最长上升子序列的话就要进行修改,

把dp[i]=max(dp[j])+1改成 if(dp[j]+1>dp[i]) dp[i]=dp[j]+1;

这样的话就能知道什么时候修改了dp[i],当修改dp[i]的时候自然是因为i可以拼在j之后且拼完后dp[i]会变大。

故:f[i]=f[j]

当dp[j]+1=dp[i]时候,说明i即便拼在j后面dp也不会变化,那就说明拼在这个j后面也是最优解。

故:f[i]+=f[j]

类似最短路径个数问题嘛!

#include <bits/stdc++.h>
using namespace std;
const int N=27;
int n,m,h[N],dp[N],f[N],ans1,ans2;int main(){cin>>m;while(m--){cin>>n;ans1=0;ans2=0;for(int i=1;i<=n;i++){cin>>h[i];dp[i]=f[i]=1;}for(int i=2;i<=n;i++)for(int j=i-1;j;j--){if(h[j]<=h[i]){if(dp[j]+1>dp[i]){//更新最优解就继承dp[i]=dp[j]+1;f[i]=f[j];}else if(dp[j]+1==dp[i])//当前的j也是可以使变成最优解的jf[i]+=f[j];}}for(int i=1;i<=n;i++)ans1=max(ans1,dp[i]);for(int i=1;i<=n;i++)if(dp[i]==ans1)ans2+=f[i];cout<<ans1<<" "<<ans2<<'\n';}	
}

        

         

 四柱河内塔

思路:

这道题听过的很简单,没见过的确实很难做了。

首先我们从最简单的3柱开始:就如下图,对于n柱的河内塔把第一柱上面n-1个放到中间的柱子上,然后剩下的一个放到最右边,然后就转化成了把n-1个盘子的三柱河内塔问题。

设置dp[i]表示i个盘子的三柱河内塔问题。

那么对应转移方程:dp[i]=(dp[i-1]+1)+dp[i-1]=2*dp[i-1]+1

那么现在来考虑四柱河内塔情况:

对于n个盘子的四柱河内塔,我们先将上面的n-k个放到任意一柱上,然后剩余的k个放到最右边柱子。最后也转化成了n-k个盘子的四柱河内塔问题。

要注意的一点是:在转移k个盘子的情况属于3柱的河内塔问题,因为有一柱是不能使用的。

转移方程:dp[i]=(p[i-k]+f[k])+dp[i-k]  其中f[k]是三柱k个盘子的河内塔问题。dp[i-k]是四柱n-k个盘子的河内塔问题。但是我们并不确定到底是让k取多少,但是我们确定的是k的选值必须使得dp[i]最小。那么就有dp[i]=min{ (p[i-k]+f[k])+dp[i-k] } 

         

 

下面是代码部分 

#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int f,dp[55];
int main(){cin>>f;memset(dp,INF,sizeof(dp));dp[0]=0;dp[1]=1;dp[2]=3;//初始化cout<<1<<'\n'<<3<<'\n';for(int i=3;i<=f;i++){for(int j=1;j<i;j++){if(dp[i]>2*dp[i-j]+pow(2,j)-1)//pow(2,j)-1就是f[j]的值dp[i]=2*dp[i-j]+pow(2,j)-1;}cout<<dp[i]<<'\n';}
}

 

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

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

相关文章

C++11教程:C++11新特性大汇总(第六部分)

C11是2011年发布的C标准&#xff0c;是C的一次重大升级。 第十二部分&#xff1a;C多文件编程 十一、C11列表初始化&#xff08;统一了初始化方式&#xff09; 我们知道&#xff0c;在 C98/03 中的对象初始化方法有很多种&#xff0c;请看下面的代码&#xff1a; //初始化列…

Jasper report InputStream动态生产Logo

第一步&#xff0c;新建一个Parameter 新建一个对象Parameter&#xff0c;类型为java.io.InputStream 第二步&#xff0c;拖拽Image对象 拖拽Image对象&#xff0c;并调整长宽&#xff0c;Image下选择Expression $P{Logo_Blue} 第三步&#xff0c;把图片转换成stream rptHea…

Vue+element-china-area-data实现省市区三级联动

安装依赖 npm install element-china-area-data -S cnpm install element-china-area-data -S 引用 import { provinceAndCityData, regionData, provinceAndCityDataPlus, regionDataPlus, CodeToText, TextToCode } from element-china-area-data&#xff1b; provinceAnd…

用Python发送通知到企业微信,实现消息推送

Hi&#xff0c;大家好&#xff0c;今天就介绍如何实现自动推送消息到企业微信&#xff0c;适合告警类型通知&#xff0c;非常方便。 一、账号准备 1、新建应用 首先登录网页版企业微信 ( https://work.weixin.qq.com)&#xff0c;如果没有企业微信账号&#xff0c;则需要注册…

Aloha 机械臂的学习记录3——AWE:Pycharm运行代码记录

之前的博客创作了三偏关于Aloha_AWE的liunx终端指令运行代码的示例: Aloha 机械臂的学习记录——AWE&#xff1a;Bimanual Simulation Suite: https://blog.csdn.net/qq_54900679/article/details/134889183?spm1001.2014.3001.5502 Aloha 机械臂的学习记录1——AWE&#x…

Q-BENCH: A BENCHMARK FOR GENERAL-PURPOSEFOUNDATION MODELS ON LOW-LEVEL VISION

继续分享Q系列文章&#xff0c;今天分享Q-BENCH。 简单来说&#xff0c;作者对MLLMs在lowlevel领域中的评价提出了一个测试基准&#xff0c;主要分三点进行讲述。 有点类似于综述&#xff0c;显然作者团队在MLLM的lowlevel领域属于开山之作了。 第一个基准叫感知Perception 简…

《JVM由浅入深学习【六】 2024-01-10》JVM由简入深学习提升分享

目录 1.jvm堆内存分代模型介绍一下JVM中堆的垃圾回收过程堆的结构新生代的垃圾回收流程1. Minor GC2. Full GC总结 什么是老年代空间分配担保机制什么情况下对象会进入老年代?JVM 运行时数据区 元空间的特点及作用?结语: 1.jvm堆内存分代模型 介绍一下JVM中堆的垃圾回收过程 …

【深度学习:Foundation Models】基础模型完整指南

【深度学习&#xff1a;Foundation Models】基础模型完整指南 什么是基础模型&#xff1f;基础模型背后的 5 项人工智能原理根据大量数据进行预训练自我监督学习过度拟合微调和快速工程&#xff08;适应性强&#xff09;广义的 基础模型的用例基础模型的类型计算机视觉基础模型…

【手搓深度学习算法】用逻辑回归分类双月牙数据集-非线性数据篇

用逻辑回归分类-非线性数据篇 前言 逻辑斯蒂回归是一种广泛使用的分类方法&#xff0c;它是基于条件概率密度函数的最大似然估计的。它的主要思想是将输入空间划分为多个子空间&#xff0c;每个子空间对应一个类别。在每个子空间内部&#xff0c;我们假设输入变量的取值与类别…

大创项目推荐 深度学习实现语义分割算法系统 - 机器视觉

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

大数据毕业设计:图书推荐系统+可视化+Django框架 图书管理系统 (附源码+论文)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

2024年动画云渲染,渲染农场使用图文步骤

“云渲染”、“渲染农场”在做三维动画的公司以及个人都非常的清楚&#xff0c;这些主要是提升用户的渲染速度&#xff0c;由于动画公司通常制作的时间比较长&#xff0c;在渲染时本地电脑往往满足不了渲染需求。今天以动画云渲染农场&#xff0c;看看渲染农场怎么使用的吧&…