戳气球问题

article/2025/9/10 19:53:32

戳气球问题本质上可以认为是一种组合+逆推的问题(背包问题模型)

 我们可以有两种方法

1.dfs爆搜法

2.dp法

1.dfs爆搜法

dfs爆搜就是暴力枚举出哪个先破,哪个后破,直到找出最佳的方案

本质上是一个全排列问题,但是全排列问题时间复杂度是O(10的n次方),不适合本题,所以我们采用dp更好

#include <iostream>
using namespace std;
int n;
int ans = 0;
int w[1001];
int visit[1002];
void dfs(int x, int sum)
{//x表示选了几个,sum表示现在的奖励总和if (x >= n){ans = max(ans, sum);return;}for (int i = 1;i <= n;i++){if (!visit[i]){visit[i] = 1;int L=1, R=2;for (int k = i - 1;k >= 0;k--)if (!visit[k]){L = k; break;}for (int k = i + 1;k <= n+1;k++)if (!visit[k]){R = k; break;}dfs(x + 1, sum + w[i]*w[L]*w[R]);visit[i] = 0;}}
}
int main()
{cin >> n;for (int i = 1;i <= n;i++)cin >> w[i];w[0] = w[n + 1] = 1;//先戳破第一个for (int i = 1;i <= n;i++){if (!visit[i]){visit[i] = 1;int L=0, R=n+1;for (int k = i - 1;k >= 0;k--)if (!visit[k]){L = k; break;}for (int k = i + 1;k <=n+1;k++)if (!visit[k]){R = k; break;}dfs(1, w[i]*w[L]*w[R]);visit[i] = 0;}}cout << ans;
}

2.dp法

我们可以先假设两个虚拟节点,第0结点和第n+1结点,他们的奖励都是1

下面分析一下假设k是最后一个被戳破的气球

 在(i,k)区间中,由于全部被戳破,他的最大奖励是dp[i][k]

在(k,j)区间中,由于全部被戳破,他的最大奖励是dp[k][j]

此时k的左节点是  第i个结点,k的右节点是  第j个结点

 

那么可以得到一个基本框架

for(遍历所有i)for(遍历所有j)for(i<k<j)dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+w[i]*w[k]*w[j]);

 最后的答案就是dp[0][n+1],表示0~n+1区间获得的最大奖励值

所以我们只要确保计算dp[i][j]的时候,dp[i][k]和dp[k][j]已经计算出来了即可

所以i是从下往上遍历的,j是从左往右遍历的

 下面给出代码

#include <iostream>
using namespace std;
const int N = 1005;
int dp[N][N];
int s[N];
int main()
{int n;cin >> n;for (int i = 1;i <= n;i++){cin >> s[i];}s[0] = s[n + 1] = 1;//两个虚拟结点//dp[i][j]表示开区间(i,j)的最大奖励for (int i = n - 1;i >= 0;i--)							//i从倒数第二个开始,遍历到0for (int j = i + 2;j <= n + 1;j++)					//由于开区间,(i,j)至少应包含一个,遍历到n+1{for (int k = i + 1;k < j;k++)					//开区间,k表示i的下一个,k不会到达j,因为开区间,j取不到dp[i][j] = max(dp[i][j], dp[i][k] + dp[k][j] + s[i] * s[j] * s[k]);}cout << dp[0][n + 1];
}

 


http://chatgpt.dhexx.cn/article/2vkJvQ2E.shtml

相关文章

Linux修改主机名—主机名和IP映射

一、修改主机名 /etc/sysconfig/network 二、主机名和IP映射 /etc/hosts Windows 里面的路径&#xff1a;C:\Windows\System32\drivers\etc

Linux系统下如何修改主机名

Linux系统安装好后&#xff0c;都会有默认的主机名&#xff0c;这里以CentOS系统为例&#xff0c;默认的主机名为localhost.localdomain&#xff0c;为了便于使用&#xff0c;我们常常需要修改主机名&#xff0c;下面演示的是永久更改主机名的方法。 方法/步骤 以根用户登录&a…

杂记 | Linux修改主机名(不用重启)

新买的云服务器主机名比较奇怪。强迫症难受&#xff0c;于是想通过Linux命令修改主机名&#xff0c;且选择最轻松的方案&#xff08;不想重启系统&#xff09;&#xff0c;使用以下命令即可&#xff1a; hostnamectl set-hostname 主机名 systemctl restart systemd-hostnamed…

修改Linux的主机名

修改主机名 新申请下来的设备&#xff0c;修改root后面的主机名为一连串的字符和数字用于centos7.X&#xff0c;其他版本未验证 修改主机名 hostnamectl set-hostname Test_Server1修改后可查看是否修改成功 cat /etc/hostname也可以通过修改hostname文件修改主机名未生效可…

Linux 永久修改主机名(转载)

Linux修改主机名&#xff0c;永久生效。 linux查看主机名: 查看主机命令&#xff1a; [rootlinux_epm2 ~]# hostname localhost.localdomain localhost.localdomain即为默认的主机名。 修改network文件: 用root用户登录&#xff0c;如果不是root用户&#xff0c;使用su命令切换…

Linux修改主机名(hostname)

查看当前的主机名 #第一种hostname #第二种hostnamectl修改主机名 执行修改命令&#xff1a; hostnamectl set-hostname <new-hostname>编辑hosts文件 vim /etc/hosts

Linux修改主机名(静态主机名、临时主机名)

背景 通常情况下Linux在安装时会设置主机名、root密码等相关参数&#xff0c;但安装后的使用过程中或许你需要修改主机名&#xff0c;本文讲述如何修改主机名&#xff0c;包括临时修改和永久修改。 查看主机名 原生态的Linux一般自带两个命令&#xff1a;hostname、hostname…

linux修改主机名命令

一、 使用hostname命令 比如我现在的主机名是haozhikuan-hbza&#xff0c;如果我想把主机名变成hbza-hbza可以用 hostname hbza-hbza 然后 hostname 或者uname -u都可以查看自己的主机名&#xff0c;如果再新打开一个终端就能看到自己的主机名已经修改过变成hbza-hbza了。 不…

Linux修改主机名永久生效

Linux&#xff08;centos7非此方法&#xff09; 修改主机名&#xff0c;永久生效。 linux查看主机名: 查看主机命令&#xff1a; [rootlinux_epm2 ~]# hostname localhost.localdomain localhost.localdomain即为默认的主机名。 修改network文件: 用root用户登录&#xf…

Linux修改主机名和域名

在/etc里有一个hostname这个是主机名存放文件&#xff0c;修改主机名就在这里面修改&#xff0c;用命令&#xff1a; vim /etc/hostname 进入后直接按下键盘上的D键&#xff0c;一下不行就两下&#xff0c;D键就将原有的主机名给删了&#xff08;D键可以一次性将光标所处的那一…

Linux修改主机名--立即生效的方法

Linux修改主机名–立即生效的方法 在使用Linux操作系统过程中&#xff0c;如果我们想更改主机名时&#xff0c;可以用以下命令进行操作 查看主机名 [rootecs-5332 ~]# hostname ecs-5332修改主机名&#xff0c;【myhost】可以替换为自己想要的主机名 [rootecs-5332 ~]# hos…

Linux永久修改主机名和IP

Linux永久修改主机名和IP 文章目录 Linux永久修改主机名和IP一、修改主机名1.查看当前主机名2.修改主机名的配置文件3.要想通过主机名访问&#xff0c;还需要修改一个配置文件4.然后执行reboot重启电脑5.再次执行hostname是否是你修改后的主机名 二、设置静态ip1.查看本机的配置…

Linux修改主机名的两种方法

Linux修改主机名的两种方法文章目录 先展示一下效果一、通过hostname命令直接更改主机名&#xff08;不是永久&#xff09;1、显示当前的主机名2、更改主机名 二、通过修改配置文件&#xff08;永久改&#xff09;1、hostname 和 hosts文件的作用2、修改配置文件中的主机名称 自…

修改Linux系统的主机名

1、查看当前的主机名 hostname 例&#xff1a; 2、修改主机名 (1)打开hostname文件 vim /etc/hostname (2) 按I键进入编辑模式&#xff0c;修改文件里的名字 例&#xff1a; (3)按Esc键&#xff0c;然后输入:&#xff0c;最后输入wq并按回车键退出 3、重新启动服务器 4…

Linux命令之修改主机名hostnamectl

概述 hostnamectl 可用于显示主机名和一些系统相关的信息&#xff0c;主要用于永久修改主机名并且不需要重启系统。 注&#xff1a;hostnamectl 是 CentOS 7 及以上版本才增加的命令。 语法 该命令的语法如下&#xff1a; hostnamectl [选项] [参数]该命令支持的选项有&…

linux修改主机名的三种方法

1.通过比较老的方法vim /etc/hostname 进行编辑修改——重启后生效 2.hostnamectl set-hostname 主机名 ——重启后生效 3.通过内核去修改主机名(红帽8版本) echo 主机名 > /proc/sys/kernel/hostname(无法直接编辑文件&#xff0c;利用重定向可以)——立即生效

Linux系统修改主机名称方法

在Linux系统中&#xff0c;修改主机名称的方法主要有以下两种&#xff1a; 1. 使用hostnamectl命令修改主机名称 hostnamectl命令是一个系统管理工具&#xff0c;它可以用于管理主机名、静态主机名、虚拟主机名等。使用该命令可以修改主机名&#xff0c;并且该修改是永久性的。…

Linux服务器主机名的3种修改方法

查看主机名 hostname方法一&#xff1a;修改配置文件 主机名保存在/etc/hostname文件里&#xff0c;把旧的主机名删除&#xff0c;替换为新的主机名&#xff0c;保存文件就行了。要注意大小写。 如需修改&#xff0c;使用vi 命令即可。 方法2&#xff1a;hostnamectl命令 ho…

总结Linux修改主机名的四种方式

总结Linux修改主机名的四种方式 看网上很多文章&#xff0c;有些比较简洁&#xff0c;但是有些很繁琐&#xff0c;不多说&#xff0c;参考各路大神的文章&#xff0c;以下是本人对这几种方式进行简要介绍&#xff0c;如有不足之处&#xff0c;还望各位大佬指点迷津。 方式一&…

Linux 修改主机名(立即永久生效)

1、修改主机名&#xff1a;命令提示符后输入命令&#xff1a; hostnamectl set-hostname 新主机名 2、立即生效&#xff1a;输入命令&#xff1a;bash 3、系统重启&#xff08;可以在终端中执行 reboot 命令&#xff09;&#xff0c;在 terminal 终端中即可看到新主机名。 原来…