递推第2题—凸多边形的三角形剖分

[问题描述]

在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形剖分成了若干个三角形。现在的任务是从键盘输入凸多边形的边数n,求不同剖分的方案数Cn。比如当n=5时,有5种不同的方案,所以Cn=5。

[问题分析]

Catalan数……估计都知道,我就不解释了,直接上代码:这是我写的(好像很短啊,最喜欢短代码了):

var c:array[2..22]of longint;//当Catalan数列中n=22时就超出长整型,需要用到高精度
      i,n,k:integer;
begin
 fillchar(c,sizeof(c),0); c[2]:=1;
 readln(n);
 for i:=3 to n do
   for k:=2 to i-1 do
    inc(c[i],[k]*c[i-k+1]);
 writeln(c[n]);
end.

下面给出标准程序:

program p2_2(input,output);
const max=21;
var c:array[2..max] of longint;
    n,i,k:integer;
    total:longint;
begin
  write(‘input n=‘);readln(n);
  c[2]:=1;
  for i:=3 to n do
    begin
      c[i]:=0;
      for k:=2 to i-1 do c[i]:=c[i]+c[k]*c[i-k+1];
    end;
  writeln(‘catalan=‘,c[n]);
end.

答案给的另外一个参考程序用了高精度运算:

program p2_2a(input,output);
const maxn=1000;
type arraytype=array[0..maxn] of longint;
var i,j,n:longint;
    h:arraytype;
procedure mul(var h:arraytype;k:longint);
  var i:longint;
  begin
    for i:=0 to maxn do h[i]:=h[i]*k;
    for i:=0 to maxn-1 do
      begin
        h[i+1]:=h[i+1]+h[i] div 10;
        h[i]:=h[i] mod 10
      end
  end;
procedure devide(var h:arraytype;k:longint);
  var d,i,r:longint;
  begin
    r:=0;
    for i:=maxn downto 0 do
      begin
        d:=10*r+h[i];
        h[i]:=d div k;
        r:=d mod k
      end
  end;
begin {Main program}
  write(‘Input n:‘);
  readln(n);
  for i:=1 to maxn do h[i]:=0;
  h[0]:=1;
  for i:=3 to n-1 do
    begin
      mul(h,4*i-6);
      devide(h,i)
    end;
  i:=maxn;
  while (i>0) and (h[i]=0) do i:=i-1;
  for j:=i downto 0 do write(h[j]);
  writeln
end.

感觉用了高精度的程序看起来很没有美感,哪天我会分享个比较短一点的高精度。

Catalan数还有更多的性质和应用,也是OI中比较重要的一部分,有兴趣的读者可以参考wiki百科:http://zh.wikipedia.org/zh/卡塔兰数

或者是百度百科:http://baike.baidu.com/view/2499752.htm

递推第2题—凸多边形的三角形剖分

时间: 2024-10-11 17:26:14

递推第2题—凸多边形的三角形剖分的相关文章

递推第3题—极值问题

[问题描述]已知m,n为整数,且满足下列两个条件:                 ①m,n∈{1,2,…,k},即1<=m,n<=k ②(n2-mn-m2)2=1 你的任务是:编程由键盘输入正整数k(1<=k<=109),求一组满足上述两个条件的m,n,并且使m2+n2的值最大.例如,我们从键盘输入k=1995,则输出m=987,n=1597. [问题分析] 典型的数学题……我们可以就条件②出发利用求根公式加上限制条件去解方程,一定能得到正确的解,但是数据范围是109,这种方法只

HDU 2013(递推&amp;递归_D题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2013 ----------------------------------------------------------------------------------- 题意:每天吃掉一半再多一个,给出第几天吃到只剩一个,求开始时的数量. 思路:递推.按照每天的处理方式反向处理一下,最终得到结果. 代码: #include<cstdio> #include<cstring> #in

HDU 2045(递推&amp;递归_B题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2045 ----------------------------------------------------------------------------------- 题意:3种颜色,方格涂色,从左到右,最后一个方格颜色不能和第一个方格颜色相等,相邻颜色不能相同. 思路:最开始思路想简单了,以为第一个方格3种颜色,第二个方格到倒数第二个方格都是2种选择,最后一个方格一种选择.但是,这种递推需要

UVALive 7431(递推&amp;递归_C题)解题报告

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5453 ----------------------------------------------------------------------------------------------------------------------------------

HDU 2044(递推&amp;递归_A题)解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2044 ------------------------------------------------------------------------------------ 题意:只能爬向+1或者+2的房间,求第a个房间到第b个房间的路线多少. 思路:递归,爬向第k个房间只能从第k-1或者k-2个房间爬动,所以相加递归即可. 注意: 递归的题目一般要用数组存上所求的解,防止给出较大值时造成的TLE

UVA 12034(递推&amp;递归_I题)解题报告

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3185 -----------------------------------------------------------------------------------------------------------------------------------------

【DP】一道递推题。。。

Bob想要构造一张由n个节点构成的图.构造的过程由两步组成:首先Bob会取出n个孤立的点,并把它们从1到n编号,然后对每个节点用一种颜色染色,Bob一共可以使用K种不同的颜色.接下来Bob会在这张图中加入一些有向边,对于每一个编号范围在[2,n]的节点i,Bob有可能选择一个节点j满足j < i并且节点i与j的颜色不同,然后加入一条从i到j的有向边,对于节点i,Bob也有可能不加任何的有向边.现在你需要回答Bob有可能构造出多少种不同的图. 输入: 第一行包含三个整数n,K. 输出: 输出一个整

hdu 1267 下沙的沙子有几粒?(二维递推题)

题意:就是给你m个H和n个D,然后从左开始数H的累积个数总是不比D的累计数少的排列有多少种举一个测试案例吧:3个H和1个D总共有3种排列,依次是:H D H H,H H D H,H H  H D三种排列,亲~意思应该懂了吧?!呵呵... 思路:递推公式为:a[m][n]=a[m-1][n]+a[m][n-1];然后当n=0的时候无论m取何值都是1,递推公式怎么推来的呢?我现在说下我的思路吧!假设3个H和2个D是由2个H和2个D还有3个H一个D推来的,2个H和2个D总共有H D H D,H H D

2014 BNU 邀请赛E题(递推+矩阵快速幂)

Elegant String 题意:给定一个字符串,由0-k数字组成,要求该串中,子串不包含0-k全排列的方案数 思路:dp[i][j]表示放到i个数字,后面有j个不相同,然后想递推式,大概就是对应每种情况k分别能由那几种状态转移过来,在纸上画画就能构造出矩阵了,由于n很大,所以用快速幂解决 代码: #include <stdio.h> #include <string.h> const long long MOD = 20140518; int t; long long n; i