作业题
时间限制:3000 ms | 内存限制:65535 KB
难度:3
小白同学这学期有一门课程叫做《数值计算方法》,这是一门有效使用数字计算机求数学问题近似解的方法与过程,以及由相关理论构成的学科……
今天他们的Teacher S,给他们出了一道作业题。Teacher S给了他们很多的点,让他们利用拉格朗日插值公式,计算出某严格单调函数的曲线。现在小白抄下了这些点,但是问题出现了,由于我们的小白同学上课时走了一下神,他多抄下来很多点,也就是说这些点整体连线不一定还是严格递增或递减的了。这可怎么处理呢。为此我们的小白同学制定了以下的取点规则:
1、取出尽可能多的满足构成严格单调曲线的点,作为曲线上的点。
2、通过拉格朗日插值公式,计算出曲线的方程
但是,他又遇到了一个问题,他发现他写下了上百个点。[- -!佩服吧],这就很难处理了(O_O).。由于拉格朗日插值公式的计算量与处理的点数有关,因此他请大家来帮忙,帮他统计一下,曲线上最多有多少点,以此来估计计算量。
已知:没有任何两个点的横坐标是相同的。
首先,是一个整数T,代表数据的组数。
然后,下面是T组测试数据。对于每组数据包含两行:
第一行:一个数字N(1<=N<=999),代表输入的点的个数。
第二行:包含N个数对X(1<=x<=10000),Y(1<=Y<=10000),代表所取的点的横纵坐标。
2 2 1 2 3 4 3 2 2 1 3 3 4
2 2
思路:
DP。没有两个点的横坐标是相同的,排序的时候按 x 由小到大排序后,求最长上升子序列和最长下降子序列即可,不可以同时求,因为两个的状态是不一样的,求出来后比较最大值,输出最大值即可。
AC:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef struct { int x, y; } node; node no[1005]; int dp[1005]; int n; bool cmp(node a, node b) { return a.x < b.x; } int Up() { int Max = 1; dp[0] = 1; for (int i = 1; i < n; ++i) { dp[i] = 1; for (int j = 0; j < i; ++j) { if (no[j].y < no[i].y && dp[i] < dp[j] + 1) dp[i] = dp[j] + 1; } Max = max(Max, dp[i]); } return Max; } int Down() { int Max = 1; dp[0] = 1; for (int i = 1; i < n; ++i) { dp[i] = 1; for (int j = 0; j < i; ++j) { if (no[j].y > no[i].y && dp[i] < dp[j] + 1) dp[i] = dp[j] + 1; } Max = max(Max, dp[i]); } return Max; } int main() { int t; scanf("%d", &t); while (t--) { scanf("%d", &n); for (int i = 0; i < n; ++i) { scanf("%d%d", &no[i].x, &no[i].y); } sort(no, no + n, cmp); int Max = 1; Max = max( Max, Up() ); Max = max( Max, Down() ); printf("%d\n", Max); } return 0; }
相关推荐
### UCAS算法分析与设计动态规划作业题解析 #### Money Robbing 问题描述:一名窃贼计划抢劫沿街的一排房屋。每个房屋内都存放着一定数量的钱财,但相邻的房屋之间安装了相连的安全系统,如果两所相邻的房屋在同一...
【共同体八年级数学1月独立作业试题(无答案) 试题.doc】是一份针对八年级学生的数学测试卷,主要涵盖了几何、代数和数论等多个数学知识点。以下是试卷中涉及的一些关键概念和知识点的详细解释: 1. **轴对称图形**...
预处理数据,根据需求清洗、转换或聚合数据,这可以在数据工厂的自定义活动或Spark作业中完成。 C. 将预处理的数据加载到Azure SQL Data Warehouse,这可以通过Polybase的INSERT INTO语句或者Data Factory的Copy ...
- **稳态方程:** 当系统达到稳态时的状态方程,此时dp(t)/dt=0。 以上是关于“通信网复习及部分作业”中的核心知识点总结,涵盖了通信网的基础理论以及对业务分析中的排队模型等内容。通过对这些知识点的学习和...
可以使用动态规划算法,定义一个二维数组 dp,其中 dp[i][j] 表示前 i 份作业中选择 j 份作业的最大价值。然后,使用递推公式 dp[i][j] = max(dp[i-1][j], dp[i-1][j-ti] + 1),其中 ti 是第 i 份作业需要的时间。...
状态转移方程可以是`dp[i][t] = max(dp[i-1][t], dp[i-1][t-ti] + 1)`,其中`ti`是第`i`份作业所需时间。目标是找到最大的`dp[n][k]`,表示在给定时间内最多能完成的作业数。 以上这些问题都可以通过动态规划的递推...
### 算法分析作业答案:石子合并问题 #### 题目背景与目标 在本题中,我们面临的是一个经典的动态规划问题——石子合并问题。该问题的具体情境是在一个操场的一行上摆放着共N堆石子,每堆石子的数量已知。目标是将...
公式为:TC = DP + CD/Q + HQ/2,其中D是年度需求量,P是采购单价,C是每次订货的固定成本,H是单位库存的年存储成本,Q是订货批量。 2. 定期订货法:这是一种按照固定时间间隔进行订货的策略,订货量根据库存情况...
在"android UI设计实操练习题.docx"文件中,可能包含了针对以上知识点的具体题目,例如要求设计一个包含特定控件和交互的界面,或者实现某种动画效果。通过解答这些题目,开发者可以深入理解和熟练掌握Android UI...
第六章的动态规划(DP)是一种优化技术,通过构建和利用子问题的解来解决原问题。经典的动态规划问题有Fibonacci数列、最短路径问题(如Dijkstra算法)和背包问题。动态规划的特点是避免了重复计算,通过存储子问题...
包含a[i]时,dp[i]可能是dp[i-1] + a[i](如果a[i]>0,否则dp[i]只可能是a[i])。不包含a[i]时,dp[i]保持为dp[i-1]。所以dp[i] = max(dp[i-1] + a[i], dp[i-1])。 - **时间复杂度**:动态规划算法的时间复杂度是O...
本资料整理了适合初学者和自学者的ACM考试题目及作业答案,同时也对准备复试的考生非常有用。 1. **平面分割问题** 这是一道递归求解的问题,题目描述了n条封闭曲线在平面上的分割情况。当n条曲线时,问题可以通过...
马上假期就要结束了,zjm还有 n 个作业,完成某个作业需要一定的时间,而且每个作业有一个截止时间,若超过截止时间,一天就要扣一分。 zjm想知道如何安排做作业,使得扣的分数最少。 Tips: 如果开始做某个作业,就...
题目要求解决的是最少需要请多少位高手来完成所有作业题的问题。以下是该问题的详细分析: 题目描述了一个情景,SubRaY面临n道作业题,他都不会解答,但他知道有w位高手,每位高手能解答一部分题目。目标是找出最小...
题目要求计算SubRaY至少需要请多少位高手来完成所有作业题,其中每位高手都有他们擅长的不同题目。这是一个典型的组合优化问题,可以通过搜索算法来求解。 首先,题目给出的输入包括两部分:题目总数n和高手总数w,...
动量定理表明,物体动量的变化等于作用在它上面的合外力的冲量,可以用微分形式表示为dp/dt=F,也可以用积分形式表示为Δp=FΔt。 3. **动量守恒定律**:如果系统所受外力的矢量和为零,系统的总动量保持不变。动量...
在算法题中,回文序列问题的解决通常有多种方法,包括但不限于: 1. 直接比较法:这是最直观的方法,遍历字符串的一半,逐个字符与对应位置的字符进行比较。如果所有对应位置的字符都相同,则为回文序列。这种方法...
- 动态规划算法:设dp[i]表示以第i个元素结尾的最大子段和,状态转移方程为dp[i] = max(dp[i-1] + nums[i], nums[i]),初始状态dp[0] = nums[0]。时间复杂度为O(n)。 2. 双机排程问题: - 目标是找到一种作业分配...
本章作业主要涵盖了动态规划(Dynamic Programming, DP)和贪心算法(Greedy Algorithm)的相关知识。动态规划是一种用于解决最优化问题的有效方法,它通过分解问题并解决子问题来找到全局最优解。贪心算法则是在每...