武科大有沁湖,与黄家湖相连,是武科大的校内湖,湖中一座长桥连通南北两苑,武科大以汇湖为载体,每年举力沁湖龙舟赛、汇湖诗会、沁湖时光、沁油讲堂、沁湖鱼哀等校园文化活动。沁湖边上也栽有很多花,小明知道后就一直想赏货花。现在小明得知在沁湖边上有n个点,这几个点从1到n顺时针为围成一圈,每个点栽有一颗花树。有四种花树:梅花(花期1.3月)、樱花(花期月3-4月)、石補花(花期4 -5月)。桂花(花期9 10月》每种花只在自己的花开花。小明给每个点标记一个值p,p的值表示该点是哪种花,1代表梅花,2代表樱花,3代表石楠花,4代表桂花。小明现在制定了m种观赏方案,每次定一个月份工,在2月去第花,在由于沁湖太大,小明就选了湖边两个点u 、v,想就欣赏从u到u沿途的花就好了,因为湖中有桥,现在他发现从u走到了v几种不同的方式,他想知道治途最多能看到多少花树正在开花(走到一个点才能看见这个点的花是否开了,不能重复经过同一个点)。多组测试数据。 对于每组数据:要求: (1) 如地点用结构体类型(至少包括种什么类型的花、是否能看到花) struct place int f_ type;//1-4 int if open://0没开,开放 提示:利用malloc 建立动态数组 出发点和结束点考虑在桥的同侧还是异侧。C语言

时间: 2024-02-20 21:57:38 浏览: 25
这是一道比较具体的编程题,需要用到结构体和动态数组,以下是一个简单的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #define MAX_N 1000 #define INF 0x3f3f3f3f typedef struct { int flower_type; // 1-4 分别表示四种花 int is_open; // 0 表示未开放,1 表示开放 } Place; Place places[MAX_N + 5]; // 存储每个点的信息 int dp[MAX_N + 5][MAX_N + 5][4]; // 动态规划数组,dp[i][j][k] 表示从 i 走到 j,经过的花种类为 k 的最大值 int main() { int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d%d", &places[i].flower_type, &places[i].is_open); } for (int k = 1; k <= 3; k++) { // 预处理 dp 数组 for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { if (i == j) { continue; } int dis = (j - i + n) % n; // 计算两点间的距离 int cnt = 0; for (int p = i + 1; p < j; p++) { if (places[p].flower_type == k && places[p].is_open) { cnt++; } } if (places[i].flower_type == k && places[i].is_open) { cnt++; dp[i][j][k] = cnt; } else { dp[i][j][k] = -INF; } for (int p = i + 1; p < j; p++) { if (dis <= n / 2 && (p - i) * 2 <= n) { dp[i][j][k] = dp[i][j][k] > dp[p][j][k] + cnt ? dp[i][j][k] : dp[p][j][k] + cnt; } else if (dis > n / 2 && (j - p) * 2 <= n) { dp[i][j][k] = dp[i][j][k] > dp[i][p][k] + cnt ? dp[i][j][k] : dp[i][p][k] + cnt; } } } } } int u, v, month; while (m--) { scanf("%d%d%d", &u, &v, &month); int max_flower = -1; for (int k = 1; k <= 3; k++) { if ((month == 1 && k == 1) || (month == 3 && k == 2) || (month == 4 && k == 3) || (month == 9 && k == 4)) { max_flower = max_flower > dp[u][v][k] ? max_flower : dp[u][v][k]; } } printf("%d\n", max_flower); } return 0; } ``` 以上代码中,我们使用了一个三维的动态规划数组 `dp[i][j][k]`,表示从点 i 走到点 j,经过的花种类为 k 的最大值。 在程序中,我们先预处理了 `dp` 数组,然后针对每个询问,直接从 `dp` 数组中查询对应的结果即可。 需要注意的是,由于是一个环形结构,所以在计算两点间的距离时,需要使用 `(j - i + n) % n`,而不是 `j - i`。 另外,由于动态规划数组的存储可能会非常大,所以我们需要使用动态数组来存储。在这里,我们使用了全局变量 `places` 来存储每个点的信息,而使用了局部变量 `dp` 来存储动态规划数组。

相关推荐

最新推荐

recommend-type

Freeswitch集成科大讯飞及百度语音服务.docx

Freeswitch集成科大讯飞及百度语音服务,Freeswitch集成科大讯飞及百度语音服务,Freeswitch集成科大讯飞及百度语音服务
recommend-type

江科大SQL课程实验报告

江苏科技大学数据库课程实验报告,包括数据定义、数据操纵、完整性约束、数据库设计,数据库编程,共计5个实验的代码
recommend-type

国科大模式识别和机器学习考试提纲

这个是19年考试前整理的考试范围提纲, 因为19年的考试题目变化较大,取消了选择题,这里只是一个提纲,请大家酌情下载。
recommend-type

国科大模式识别与机器学习考题总结(详细答案)

国科大模式识别与机器学习考题总结 国科大秋季学期
recommend-type

信号与系统实验一、二、三

信号与系统的实验报告 武科大 实验一、二、三的实验报告 运行的都很正确,大家可以直接搬用
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。