NOJ 1031 建筑群最长坡值 (线性dp)

本文介绍了一种解决最长下降子序列问题的算法,并通过一个具体示例详细展示了如何运用动态规划方法找到给定序列中最长的单调递减子序列。通过对每个元素计算并更新其对应的最长子序列长度,最终找出序列中的最长下降子序列长度。


建筑群最长坡值

                                  Time Limit(Common/Java) : 1000 MS/ 3000 MS          Memory Limit : 65536 KByte

Description

建筑群所有建筑高度分别为h1h2…hN,可以得到一些单调递减的序列hi1hi2…hiK,其长度称为建筑群的坡值,这里1i1< i2<…< iKN

你的任务:对于给定的建筑群所有建筑高度,求出建筑群最长坡值。



Input

第一行是建筑群中的建筑数N1N1000)。

第二行依次给出各个建筑的高度(大小从01000),中间用空格分开。

Output

建筑群最长坡值

Sample Input

10
108 60 79 50 119 40 90 230 20 80

Sample Output

5

Source

南京邮电大学计算机学院首届ACM程序设计大赛(2009)


题目连接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1031


题目分析:线性dp,从前往后扫,更新到每点的最长坡值,最后取最大值

样例分析:

dp[0] = 1  (108)

dp[1] = 2  (108 > 60)  

dp[2] = 2  (108 > 79)

dp[3] = 3  (60 > 50)

dp[4] = 1  (119)

dp[5] = 4  (50 > 40)

dp[6] = 2  (119 > 90)

dp[7] = 1  (230)

dp[8] = 5  (40 > 20)

dp[9] = 3  (90 > 80)

ans = 5


#include <cstdio>
#include <algorithm>
using namespace std;
int const MAX = 1000;
int h[MAX], dp[MAX];
int main()
{
    int n , ans = -1;
    scanf("%d",&n);
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &h[i]);
        dp[i] = 1;
    }
    for(int i = 0; i < n; i++)
        for(int j = 0; j < i; j++)
            if(h[j] > h[i])
                dp[i] = dp[j] + 1 > dp[i] ? dp[j] + 1 : dp[i];
    for(int i = 0; i < n; i++)
        ans = max(ans, dp[i]);       
    printf("%d\n", ans);
}



独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)内容概要:本文围绕“独立储能的现货电能量与调频辅助服务市场出清协调机制”展开,提出了一种基于Matlab代码实现的优化模型,旨在协调独立储能系统在电力现货市场与调频辅助服务市场中的联合出清问题。文中结合鲁棒优化、大M法和C&CG算法处理不确定性因素,构建了多市场耦合的双层或两阶段优化框架,实现了储能资源在能量市场和辅助服务市场间的最优分配。研究涵盖了市场出清机制设计、储能运行策略建模、不确定性建模及求解算法实现,并通过Matlab仿真验证了所提方法的有效性和经济性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事电力市场、储能调度相关工作的工程技术人员。; 使用场景及目标:①用于研究独立储能在多电力市场环境下的协同优化运行机制;②支撑电力市场机制设计、储能参与市场的竞价策略分析及政策仿真;③为学术论文复现、课题研究和技术开发提供可运行的代码参考。; 阅读建议:建议读者结合文档中提供的Matlab代码与算法原理同步学习,重点关注模型构建逻辑、不确定性处理方式及C&CG算法的具体实现步骤,宜在掌握基础优化理论的前提下进行深入研读与仿真调试。
### 高精度计算 π 的方法 高精度计算 π 是计算机科学中的经典问题之一。通过数分析和算法设计,可以实现任意精度下的 π 计算。以下是几种常见的高精度 π 计算方法及其代码实现。 #### 方法一:Chudnovsky 算法 Chudnovsky 算法是一种快速收敛的级数展开方法,适合用于高精度 π 的计算。其核心公式如下: \[ \frac{1}{\pi} = 12 \sum_{k=0}^\infty \frac{(-1)^k (6k)! (13591409 + 545140134k)}{(3k)!(k!)^3 640320^{3k + 3/2}} \] 此公式的优点在于每增加一项,可使 π 的位数增长约 14 位[^1]。 下面是基于 Python 和 `decimal` 模块的一个简单实现: ```python from decimal import Decimal, getcontext def compute_pi_chudnovsky(precision): getcontext().prec = precision + 2 C = 426880 * Decimal(10005).sqrt() M = 1 L = 13591409 X = 1 K = 6 S = L for k in range(1, int((precision / 14)) + 1): M = (M * ((K ** 3) - 16 * K)) // (k ** 3) L += 545140134 X *= -262537412640768000 S += Decimal(M * L) / X pi = C / Decimal(S) return str(pi)[:precision] print(compute_pi_chudnovsky(100)) ``` #### 方法二:Gauss-Legendre 算法 Gauss-Legendre 算法利用迭代逼近的方式计算 π,具有二次收敛特性(即每次迭代后的有效位数翻倍)。初始设定为: - \( a_0 = 1 \), \( b_0 = \frac{\sqrt{2}}{2} \), \( t_0 = \frac{1}{4} \), \( p_0 = 1 \) 迭代更新规则为: - \( a_{n+1} = \frac{a_n + b_n}{2} \) - \( b_{n+1} = \sqrt{a_n b_n} \) - \( t_{n+1} = t_n - p_n(a_n - a_{n+1})^2 \) - \( p_{n+1} = 2p_n \) 最终结果由下式给出: \[ \pi \approx \frac{(a_n + b_n)^2}{4t_n} \] Python 实现如下: ```python from decimal import Decimal, getcontext def gauss_legendre_pi(precision): getcontext().prec = precision + 2 one_half = Decimal('0.5') a = Decimal(1) b = Decimal(1).sqrt() / Decimal(2) t = Decimal('0.25') p = Decimal(1) iterations = int(precision.bit_length()) + 2 for _ in range(iterations): anext = (a + b) / Decimal(2) bnext = (a * b).sqrt() t -= p * (a - anext)**2 a, b, p = anext, bnext, p << 1 pi = (a + b)**2 / (Decimal(4) * t) return str(pi)[:precision] print(gauss_legendre_pi(100)) ``` #### 初始化大数的意义 在高精度计算中,初始化大数是非常重要的一步。如果采用字符串或整数序列作为输入,则可以通过解析这些数据结构完成初始化工作。然而,在涉及无理数的情况下,由于任何实际存储都受限于有限精度,因此所谓的“无理数初始化”实际上是对某个近似的操作。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值