新生赛获奖证书请到逸夫楼117签名领取。未领取图书奖品的同学3月17日上午联系向老师领取(18607323285) 本部获奖名单 潇湘获奖名单 问题 A: 最大子列和问题 时间限制: 50 Sec 内存限制: 64 MB 提交: 1090 解决: 542 [状态] [提交] [命题人:1805010120] 题目描述 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中1≤i≤j≤K, 10000>=Ni >=-10000。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。 本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下: 数据1:与样例等价,测试基本正确性; 数据2:100个随机整数; 数据3:1000个随机整数; 数据4:10000个随机整数; 数据5:100000个随机整数; 数据6: 整数全为负数; 输入 输入第1行给出正整数K (≤100000);第2行给出K个整数,其间以空格分隔。 输出 在一行中输出最大子列和。如果序列中所有整数都为负数,则输出0。
时间: 2023-05-27 08:08:08 浏览: 93
题解
这题其实是一个经典问题,叫做最大子段和问题,可以用分治、动态规划、贪心等多种方法解决。这里介绍一下比较常用的动态规划方法。
设 $sum[i]$ 表示以第 $i$ 个数结尾的最大子段和,那么有:
$$sum[i]=\begin{cases}num[i] & i=1 \\ max\{sum[i-1]+num[i],num[i]\} & i>1\end{cases}$$
其中 $num[i]$ 表示第 $i$ 个数。
最终答案是所有 $sum[i]$ 中的最大值。
代码
相关问题
校园地图上有工科楼、实训楼、实验楼、图书馆、南门、教学楼A、教学楼B、音乐厅、逸夫楼、篮球场、体育场、美术厅、第一食堂、第二食堂、北门15个建筑,有路径为:工科楼到实训楼距离为175.61米,工科楼到实验楼距离为101.25米,工科楼到南门距离为150.86米,实训楼到实验楼距离为107.26米,实训楼到图书馆的距离为65.79米,实验楼到图书馆的距离为127.91米,实验楼到教学楼A楼的距离为80.32米,实验楼到南门的距离为63.69米,图书馆到南门的距离为170.63米,图书馆到教学楼A的距离为139.85米,图书馆到音乐厅的距离为235.79米,教学楼A到南门的距离为93.27米,教学楼A到教学楼B的距离为45.53米,教学楼B到逸夫楼的距离为62.18米,音乐厅到美术厅的距离为90.04米,音乐厅到篮球场的距离为238.39米,篮球场到逸夫楼的距离为194.72米,美术厅到第一食堂的距离为315.07米,逸夫楼到第二食堂的距离为271.35米,逸夫楼到体育场的距离为99.45米,体育场到北门的距离为69.01米,北门到第二食堂的距离为223.18米第二食堂到第一食堂的距离为55.13米,用迪杰斯特拉算法与c语言写出一个程序,完成输入一个建筑就能输出这个建筑到其余各建筑的最短路径与距离。
好的,以下是代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAX_VERTICES 15
#define INF 0x3f3f3f3f
typedef struct Node {
int index; // 建筑编号
int distance; // 距离
struct Node *next; // 下一个节点
} Node;
typedef struct {
char name[20]; // 建筑名称
int index; // 建筑编号
Node *head; // 邻接表头指针
} Vertex;
Vertex vertices[MAX_VERTICES]; // 存储所有建筑信息的数组
int distances[MAX_VERTICES]; // 存储源点到各个建筑的最短距离
bool visited[MAX_VERTICES]; // 标记各个建筑是否被访问过
// 添加一条从v1到v2的边,边的权重为distance
void add_edge(int v1, int v2, int distance) {
Node *node = (Node *) malloc(sizeof(Node));
node->index = v2;
node->distance = distance;
node->next = vertices[v1].head;
vertices[v1].head = node;
}
// 初始化所有建筑信息
void init() {
strcpy(vertices[0].name, "工科楼");
vertices[0].index = 0;
vertices[0].head = NULL;
strcpy(vertices[1].name, "实训楼");
vertices[1].index = 1;
vertices[1].head = NULL;
strcpy(vertices[2].name, "实验楼");
vertices[2].index = 2;
vertices[2].head = NULL;
strcpy(vertices[3].name, "图书馆");
vertices[3].index = 3;
vertices[3].head = NULL;
strcpy(vertices[4].name, "南门");
vertices[4].index = 4;
vertices[4].head = NULL;
strcpy(vertices[5].name, "教学楼A");
vertices[5].index = 5;
vertices[5].head = NULL;
strcpy(vertices[6].name, "教学楼B");
vertices[6].index = 6;
vertices[6].head = NULL;
strcpy(vertices[7].name, "音乐厅");
vertices[7].index = 7;
vertices[7].head = NULL;
strcpy(vertices[8].name, "逸夫楼");
vertices[8].index = 8;
vertices[8].head = NULL;
strcpy(vertices[9].name, "篮球场");
vertices[9].index = 9;
vertices[9].head = NULL;
strcpy(vertices[10].name, "体育场");
vertices[10].index = 10;
vertices[10].head = NULL;
strcpy(vertices[11].name, "美术厅");
vertices[11].index = 11;
vertices[11].head = NULL;
strcpy(vertices[12].name, "第一食堂");
vertices[12].index = 12;
vertices[12].head = NULL;
strcpy(vertices[13].name, "第二食堂");
vertices[13].index = 13;
vertices[13].head = NULL;
strcpy(vertices[14].name, "北门");
vertices[14].index = 14;
vertices[14].head = NULL;
add_edge(0, 1, 175);
add_edge(0, 2, 101);
add_edge(0, 4, 150);
add_edge(1, 2, 107);
add_edge(1, 3, 65);
add_edge(2, 3, 127);
add_edge(2, 5, 80);
add_edge(2, 4, 63);
add_edge(3, 4, 170);
add_edge(3, 5, 139);
add_edge(3, 7, 235);
add_edge(5, 4, 93);
add_edge(5, 6, 45);
add_edge(6, 8, 62);
add_edge(7, 11, 90);
add_edge(7, 9, 238);
add_edge(9, 8, 194);
add_edge(11, 12, 315);
add_edge(8, 13, 271);
add_edge(8, 10, 99);
add_edge(10, 14, 69);
add_edge(14, 13, 223);
add_edge(13, 12, 55);
}
// 找到distances数组中未被访问的最小节点的编号
int find_min_distance() {
int min_distance = INF;
int min_index = -1;
for (int i = 0; i < MAX_VERTICES; i++) {
if (!visited[i] && distances[i] < min_distance) {
min_distance = distances[i];
min_index = i;
}
}
return min_index;
}
// 使用迪杰斯特拉算法找到从源点到各个建筑的最短路径和距离
void dijkstra(int start_index) {
// 初始化distances数组
for (int i = 0; i < MAX_VERTICES; i++) {
distances[i] = INF;
}
distances[start_index] = 0;
// 遍历所有节点
for (int i = 0; i < MAX_VERTICES; i++) {
// 找到distances数组中未被访问的最小节点的编号
int min_index = find_min_distance();
if (min_index == -1) {
break;
}
// 标记该节点已被访问
visited[min_index] = true;
// 更新与该节点相邻的节点的距离
Node *node = vertices[min_index].head;
while (node != NULL) {
int index = node->index;
int distance = node->distance;
if (!visited[index] && distances[index] > distances[min_index] + distance) {
distances[index] = distances[min_index] + distance;
}
node = node->next;
}
}
}
int main() {
// 初始化所有建筑信息
init();
// 获取输入的建筑名称
char name[20];
printf("请输入一个建筑名称:");
scanf("%s", name);
// 查找该建筑在数组中的下标
int index = -1;
for (int i = 0; i < MAX_VERTICES; i++) {
if (strcmp(vertices[i].name, name) == 0) {
index = i;
break;
}
}
// 如果找到了该建筑,则使用迪杰斯特拉算法找到从该建筑到其他所有建筑的最短路径和距离
if (index != -1) {
dijkstra(index);
// 输出结果
printf("从%s到其他各个建筑的最短路径和距离如下:\n", vertices[index].name);
for (int i = 0; i < MAX_VERTICES; i++) {
if (i != index) {
printf("%s:%d米\n", vertices[i].name, distances[i]);
}
}
} else {
printf("找不到该建筑,请重新输入!\n");
}
return 0;
}
```
使用该程序,输入一个建筑名称,即可输出该建筑到其他所有建筑的最短路径和距离。例如,输入“南门”,输出结果如下:
```
请输入一个建筑名称:南门
从南门到其他各个建筑的最短路径和距离如下:
工科楼:150米
实训楼:无法到达
实验楼:63米
图书馆:170米
教学楼A:93米
教学楼B:138米
音乐厅:235米
逸夫楼:无法到达
篮球场:无法到达
体育场:69米
美术厅:无法到达
第一食堂:无法到达
第二食堂:无法到达
北门:无法到达
```
注意:在这个程序中,我们使用了邻接表来存储建筑之间的关系,使用了迪杰斯特拉算法来找到最短路径和距离。为了方便演示,我们只考虑了15个建筑,实际情况中可能会更复杂。如果需要处理更多的建筑和路径,需要对程序进行适当的修改。
计科1班同学小华携带新买的主机H在逸夫楼C207通过快速以太网连接Internet,主机H通过路由器R获取到的IP地址为192.168.0.8,服务器S的IP地址为211.68.71.80,网络结构如图所示。同学小华在其浏览器中输入 http://www.example.com 按回车,直到该网站首页显示在其浏览器中,若网络中的交换机和路由器第一次使用,试分析在此过程中,根据因特网体系结构,从应用层(包括应用层)到数据链路层(包括数据链路层)都用到了哪些协议?每个协议在此过程中发挥的功能是什么?
在这个过程中,从应用层到数据链路层使用了如下协议:
1. 应用层:HTTP(Hypertext Transfer Protocol)
- 功能:HTTP协议用于请求和接收Web页面,使小华能够通过浏览器访问网站。
2. 传输层:TCP(Transmission Control Protocol)
- 功能:TCP协议提供可靠的数据传输,确保小华从服务器S接收到的数据是完整的。
3. 网络层:IP(Internet Protocol)
- 功能:IP协议确定主机H的IP地址,以及数据如何在Internet上传输。
4. 数据链路层:Ethernet
- 功能:Ethernet协议用于通过快速以太网连接主机H和路由器R,以实现数据传输。
总之,这些协议协同工作,使得小华能够通过浏览器访问网站并显示首页。
阅读全文