UVa 1638-Pole Arrangement

本文探讨如何通过递推方法解决杆子排列问题,详细解释了递推方程的建立与实现,提供了AC代码实例。


小结:

因为这个分类是分类在递推中的,所以想法理所当然应该往递推的方向去走,首先能想到的是从低到高依次摆放杆子,不过尝试过就知道了,做法远比想象中复杂,然后就尝试了下依次从高往低排,视野一下子就开阔了。

然后就是怎么实现递推了,令f(i,j,k)代表从左边看有i根杆子,从右边看有j根杆子,已经放置的杆子有k根的情况,由于,看到的杆子的根数只和杆子的相对高度有关,而和杆子的绝对高度无关。那么,当放入一根比已有的杆子长度都短的杆子时,只可能有3种情况:

(1)杆子放在所有杆子的最左端,造成的结果是从左边可以看见的杆子数加1,而从右边能看见的杆子数目不变。

(2)杆子放在所有杆子的最右端,造成的结果是从右边可以看见的杆子数加1,而从左边能看见的杆子数目不变。

(3)杆子放在任意中间位置,由于放入的杆子比所有的杆子的高度要低,所以从左,右两边能看见得杆子数目不变。

因此,

递推方程为:f(i,j,k)=f(i-1,j,k-1)+f(i,j-1.k)+f(i,j,k-1)

以下是AC代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<malloc.h>
using namespace std;
typedef long long ll;
ll  recur[50][50][50];
int main()
{
    int n,l,r;
    int t;
    scanf("%d",&t);
    for(int m=1;m<=t;m++)
    {
        scanf("%d%d%d",&n,&l,&r);
        memset(recur,0,sizeof(recur));
        recur[1][1][1]=1;
        recur[2][1][2]=1;
        recur[1][2][2]=1;

        for(int i=3;i<=n;i++)
        {
            for(int j=1;j<=l;j++)
            for(int k=1;k<=r;k++)
            {
                if(j==1&&k==1)
                continue;
                recur[j][k][i]=recur[j-1][k][i-1]+recur[j][k-1][i-1]+recur[j][k][i-1]*(i-2);
            }
        }
        printf("%lld\n",recur[l][r][n]);
    }
    return 0;
}



<think>嗯,用户想知道Simulink中零极点(Zero-Pole)模块的分子部分怎么设置。首先,我得回忆一下Zero-Pole模块的结构。这个模块通常用传递函数的形式表示系统,形式是增益乘以分子多项式的根(零点)除以分母多项式的根(极点)。传递函数一般写作H(s) = K * (s - z1)(s - z2).../(s - p1)(s - p2)...。 用户的问题集中在分子部分的设置方法。根据引用[1],Zeros-Pole模块是用Laplace变量s的零点、极点和增益来表征系统的。所以分子部分对应的是零点。在设置时,分子应该是零点的列表,用向量形式输入,每个元素对应一个零点。比如,如果分子是(s+2)(s+3),那么零点就是-2和-3,输入的时候应该是[-2, -3]。 不过要注意,Simulink中的Zero-Pole模块可能要求输入的是分子和分母的根,而不是多项式系数。这点和Transfer Function模块不同,后者需要输入分子分母的系数向量。比如,在Transfer Function模块里,分子可能是[1 5 6],对应s²+5s+6,而Zero-Pole模块则需要直接输入零点[-2, -3]和极点,然后增益K。例如,如果传递函数是3*(s+2)(s+3)/(s+1)(s+4),那么在Zero-Pole模块中,分子(零点)设置为[-2, -3],分母(极点)设置为[-1, -4],增益是3。 另外,用户可能需要知道如何正确输入复数零点,虽然实际中零点通常是实数或共轭复数对。输入时,复数零点应该以复数形式直接输入,比如-1+2i和-1-2i。 还有,需要注意零点、极点和增益的输入位置。在模块参数设置中,会有Zeros、Poles、Gain三个字段,分别对应分子零点、分母极点和增益K。确保不要混淆顺序,比如把零点误输入到极点部分。 可能用户之前用过Transfer Function模块,现在转向Zero-Pole模块,所以需要区分两者的设置方法。例如,在Transfer Function模块中,分子是多项式系数的降幂排列,而Zero-Pole模块则是根的形式。这可能是用户容易出错的地方,需要重点说明。 另外,引用[3]提到Simulink用于控制系统仿真,其中二阶系统的传递函数例子是num=[30],den=[1 7 0],这对应的是30/(s²+7s),但这是Transfer Function模块的设置方式。而对应的Zero-Pole模块应该分解分母的根,即s(s+7),所以极点应该是0和-7,分子如果是30的话,可能增益是30,而分子零点可能没有,即留空或设为空矩阵。但需要确认Zero-Pole模块是否允许分子为空的情况,即没有零点的情况,此时分子部分可能输入空数组[]。 总结步骤应该是:打开Zero-Pole模块参数,在Zeros处输入零点数组,Poles处输入极点数组,Gain处填写增益值。例如,传递函数H(s)=5(s+1)/(s+2)(s+3),则Zeros填[-1],Poles填[-2, -3],Gain填5。 需要提醒用户注意多项式的因式分解是否正确,以及是否遗漏了增益系数。另外,如果分子是常数项,比如H(s)=5/(s+1),那么零点部分应该留空,增益填5,极点填[-1]。这时候分子没有零点,所以Zeros是空数组。 可能用户遇到的常见错误包括:将多项式的系数误当作零点输入,或者忽略了增益项,导致传递函数结果错误。这时候需要强调Zero-Pole模块是基于因式分解后的根形式,而不是多项式系数。 最后,为了确保用户正确设置,给出一个具体的例子会很有帮助,比如引用中的例子,或者自行构造示例,说明如何将传递函数转换为Zero-Pole模块的参数设置。</think>### Simulink零极点(Zeros-Pole)模块分子设置方法 在Simulink中,零极点(Zero-Pole)模块通过传递函数形式表示系统,其分子部分对应系统的零点(Zeros)。以下是具体设置步骤: 1. **传递函数形式** 零极点模型的传递函数为: $$ H(s) = K \cdot \frac{(s - z_1)(s - z_2)\cdots}{(s - p_1)(s - p_2)\cdots} $$ 其中: - **分子部分**:由零点 $z_1, z_2, \dots$ 构成 - **分母部分**:由极点 $p_1, p_2, \dots$ 构成 - **增益**:标量系数 $K$ [^1] 2. **分子(零点)设置方法** - 在模块参数中,找到 **Zeros** 输入框,以向量形式输入零点值。 - **示例**:若分子为 $(s+2)(s+3)$,则零点为 $-2$ 和 $-3$,输入 `[-2, -3]`(见图1)。 - **复数零点**:直接输入复数形式,例如 `[-1+2j, -1-2j]`。 3. **与其他模块的对比** - **Transfer Function模块**:需输入多项式系数(如 `[1 5 6]` 对应 $s^2 + 5s + 6$)。 - **Zero-Pole模块**:直接输入根(如 `[-2, -3]` 对应 $(s+2)(s+3)$)[^3]。 4. **典型应用示例** - 传递函数 $H(s) = \frac{5(s+1)}{(s+2)(s+3)}$: - Zeros(分子):`[-1]` - Poles(分母):`[-2, -3]` - Gain(增益):`5` ```matlab % MATLAB中验证零极点模型的等效代码 sys = zpk([-1], [-2, -3], 5); % 零点、极点、增益 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值