`
Simone_chou
  • 浏览: 195823 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

作业题(DP)

    博客分类:
  • NYOJ
 
阅读更多

作业题

时间限制: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算法分析与设计动态规划作业题

    ### UCAS算法分析与设计动态规划作业题解析 #### Money Robbing 问题描述:一名窃贼计划抢劫沿街的一排房屋。每个房屋内都存放着一定数量的钱财,但相邻的房屋之间安装了相连的安全系统,如果两所相邻的房屋在同一...

    共同体八年级数学1月独立作业试题(无答案) 试题.doc

    【共同体八年级数学1月独立作业试题(无答案) 试题.doc】是一份针对八年级学生的数学测试卷,主要涵盖了几何、代数和数论等多个数学知识点。以下是试卷中涉及的一些关键概念和知识点的详细解释: 1. **轴对称图形**...

    DP-200exam(204题).docx

    预处理数据,根据需求清洗、转换或聚合数据,这可以在数据工厂的自定义活动或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 份作业需要的时间。...

    动态规划习题.doc

    状态转移方程可以是`dp[i][t] = max(dp[i-1][t], dp[i-1][t-ti] + 1)`,其中`ti`是第`i`份作业所需时间。目标是找到最大的`dp[n][k]`,表示在给定时间内最多能完成的作业数。 以上这些问题都可以通过动态规划的递推...

    算法分析作业答案:石子合并问题

    ### 算法分析作业答案:石子合并问题 #### 题目背景与目标 在本题中,我们面临的是一个经典的动态规划问题——石子合并问题。该问题的具体情境是在一个操场的一行上摆放着共N堆石子,每堆石子的数量已知。目标是将...

    采购与库存控制作业与试题复习.docx

    公式为:TC = DP + CD/Q + HQ/2,其中D是年度需求量,P是采购单价,C是每次订货的固定成本,H是单位库存的年存储成本,Q是订货批量。 2. 定期订货法:这是一种按照固定时间间隔进行订货的策略,订货量根据库存情况...

    android UI设计实操练习题(安卓作业1)

    在"android UI设计实操练习题.docx"文件中,可能包含了针对以上知识点的具体题目,例如要求设计一个包含特定控件和交互的界面,或者实现某种动画效果。通过解答这些题目,开发者可以深入理解和熟练掌握Android UI...

    吉林大学算法分析与设计习题作业答案

    第六章的动态规划(DP)是一种优化技术,通过构建和利用子问题的解来解决原问题。经典的动态规划问题有Fibonacci数列、最短路径问题(如Dijkstra算法)和背包问题。动态规划的特点是避免了重复计算,通过存储子问题...

    5动态规划演算法习题答案.pdf

    包含a[i]时,dp[i]可能是dp[i-1] + a[i](如果a[i]&gt;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考试题目及其作业答案整理

    本资料整理了适合初学者和自学者的ACM考试题目及作业答案,同时也对准备复试的考生非常有用。 1. **平面分割问题** 这是一道递归求解的问题,题目描述了n条封闭曲线在平面上的分割情况。当n条曲线时,问题可以通过...

    Week12-选做题2(状压DP)

    马上假期就要结束了,zjm还有 n 个作业,完成某个作业需要一定的时间,而且每个作业有一个截止时间,若超过截止时间,一天就要扣一分。 zjm想知道如何安排做作业,使得扣的分数最少。 Tips: 如果开始做某个作业,就...

    莞中-松山湖-长沙一中三校联考试题.pdf

    题目要求解决的是最少需要请多少位高手来完成所有作业题的问题。以下是该问题的详细分析: 题目描述了一个情景,SubRaY面临n道作业题,他都不会解答,但他知道有w位高手,每位高手能解答一部分题目。目标是找出最小...

    莞中-松山湖-长沙一中三校联考试题.doc

    题目要求计算SubRaY至少需要请多少位高手来完成所有作业题,其中每位高手都有他们擅长的不同题目。这是一个典型的组合优化问题,可以通过搜索算法来求解。 首先,题目给出的输入包括两部分:题目总数n和高手总数w,...

    力学作业解答第三章.doc

    动量定理表明,物体动量的变化等于作用在它上面的合外力的冲量,可以用微分形式表示为dp/dt=F,也可以用积分形式表示为Δp=FΔt。 3. **动量守恒定律**:如果系统所受外力的矢量和为零,系统的总动量保持不变。动量...

    算法作业_算法_回文序列_

    在算法题中,回文序列问题的解决通常有多种方法,包括但不限于: 1. 直接比较法:这是最直观的方法,遍历字符串的一半,逐个字符与对应位置的字符进行比较。如果所有对应位置的字符都相同,则为回文序列。这种方法...

    5动态规划演算法习题答案.docx

    - 动态规划算法:设dp[i]表示以第i个元素结尾的最大子段和,状态转移方程为dp[i] = max(dp[i-1] + nums[i], nums[i]),初始状态dp[0] = nums[0]。时间复杂度为O(n)。 2. 双机排程问题: - 目标是找到一种作业分配...

    算法第5章作业.doc

    本章作业主要涵盖了动态规划(Dynamic Programming, DP)和贪心算法(Greedy Algorithm)的相关知识。动态规划是一种用于解决最优化问题的有效方法,它通过分解问题并解决子问题来找到全局最优解。贪心算法则是在每...

Global site tag (gtag.js) - Google Analytics