用c语言用动态规划的方法写下面题目 有一个演讲大厅需要我们管理,演讲者们事先定好了需要演讲的起始时间和中止时间。 我们想让演讲大厅得到最大可能的使用。我们要接受一些预定而拒绝其他的预定,目标是使 演讲者使用大厅的时间最长。假设在某一时刻一个演讲结束,另一个演讲就可以立即开始。 请计算演讲大厅最大可能的使用时间。 输入格式: 第一行为一个整数 N,N≤5000,表示申请的数目。 以下 n 行每行包含两个整数 p,k,1 ≤ p < k ≤ 30000,表示这个申请的起始时间和中止时间。 输出格式: 一个整数,表示大厅最大可能的使用时间。 输入样例1: 5 0 3 2 6 5 7 1 5 5 9 输出样例1: 8
时间: 2024-03-08 14:50:21 浏览: 72
以下是使用C语言动态规划方法求解该问题的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 5000
// 申请的起始时间和结束时间
struct Talk {
int start;
int end;
};
Talk talks[MAXN];
// 动态规划数组
int dp[MAXN];
// 比较函数,用于快速排序
int cmp(const void *a, const void *b) {
Talk *t1 = (Talk*)a;
Talk *t2 = (Talk*)b;
return t1->end - t2->end;
}
int main() {
int n;
scanf("%d", &n);
// 输入申请的起始时间和结束时间
for (int i = 0; i < n; i++) {
scanf("%d%d", &talks[i].start, &talks[i].end);
}
// 按照结束时间从小到大排序
qsort(talks, n, sizeof(Talk), cmp);
// 动态规划求解最大可能使用时间
for (int i = 0; i < n; i++) {
dp[i] = talks[i].end - talks[i].start;
for (int j = 0; j < i; j++) {
if (talks[j].end <= talks[i].start) {
dp[i] = dp[i] > dp[j] + talks[i].end - talks[i].start ? dp[i] : dp[j] + talks[i].end - talks[i].start;
}
}
}
// 找出最大的使用时间
int ans = 0;
for (int i = 0; i < n; i++) {
if (dp[i] > ans) {
ans = dp[i];
}
}
printf("%d\n", ans);
return 0;
}
```
算法思路:
- 首先按照演讲结束时间从小到大排序,保证后面的演讲时间更晚;
- 用动态规划求解最大可能使用时间,dp[i] 表示以 talks[i] 结尾的最大使用时间,转移方程为:dp[i] = max(dp[j] + talks[i].end - talks[i].start),其中 j < i 且 talks[j].end <= talks[i].start;
- 最终找出 dp 数组中的最大值,即为所求的最大可能使用时间。
阅读全文