新生选拔二 - Make Triangle SPOJ - TRNGL (卡特兰数)

原创 2018年04月16日 12:20:13

题目链接 Make Triangle


题意

给你一个N边型,用(N-3)条对角线来把它切割成(N-2)个三角形,其中对角线不能相交。输出一共有几种切法,并对100007取模。


思路

这种一看就是要找规律的,比如把一个N边形切掉一个角成N-1和一个三边形,但是这个方法我试了一个小时,并没有什么结果,因为其重复的情况实在是太多了。最后的十分钟我终于有了思路,然而,时间不够了。。。。。。来讲一下方法。每次都以一条边为基础,然后枚举上方的顶点,组成一个个的三角形,通过这个三角形来对原来的N边型进行划分,这样的划分是不会出现重复的。据说这是卡特兰数,新技能学学习中。

具体解释

固定一条边,枚举一个点与这条边构成一个三角形,进而把这个大的凸多边形分成了两个较小的凸多边形和该三角形,设左边是一个i边形,那么右边就是一个n+1-i边形,dp[n]=Sum( dp[i]*dp[n+1-i] ),2<=i<=n-1 (i=2和i=n-1表示的是这条边与其相邻的一个顶点构成了一个三角形,那么这个大的凸多边形其实是变成了一个小的凸多边形和该三角形,为方便起见可以令dp[2]=1),O(n^2)预处理dp数组,每次查询O(1)输出即可 。


代码一

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

ll sum[1007];

int main()
{
    ios::sync_with_stdio(false);
    sum[1] = 1;
    sum[2] = 2;

    for (ll i = 3;i <= 1000;i ++){
        sum[i] = (sum[i-1]*2) ;
        sum[i] %= 100007;
        for (ll j = 1;j <= i-2;j ++){
            sum[i] += sum[j]*sum[i-j-1];
            sum[i] %= 100007;
        }
        sum[i] %= 100007;
    }

    ll T;
    cin >> T;
    while (T --){
        ll n;
        cin >> n;
        cout << sum[n-2] << endl;
    }
}

代码二

// 一个提交时间是我1/9的代码
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll MOD = (ll)100007;

ll dp[1007];

void init()
{
    dp[2] = dp[3] = 1;
    for(int i = 4;i <= 1000;i ++){
        dp[i] = 0;
        for(int j = 2;j < i;j ++)dp[i] = (dp[i] + dp[j]*dp[i+1-j]%MOD)%MOD;
    }
}
int main()
{
    init();
    int T,n;
    scanf("%d",&T);
    while(T --){
        scanf("%d",&n);
        printf("%lld\n",dp[n]);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40513946/article/details/79958972

Make Triangle SPOJ - TRNGL (卡特兰数)

给出一个凸n边形,求用n-3条不相交的对角线将该n边形划分为三角形的方案数 Input First line of the input will be an integer t (1 Output F...
  • dl962454
  • dl962454
  • 2017-02-15 17:37:33
  • 165

SPOJ TRNGL - Make Triangle

题意:https://mp.weixin.qq.com/s/wJ5y0QTkqT1Uz_f6BkbJ0g
  • D_xcj
  • D_xcj
  • 2017-02-05 23:17:04
  • 96

SPOJ TRNGL 卡特兰数

Make Triangle no tags  Chayanika loves Mathematics. She is learning a new chapter geometry. Whi...
  • black_miracle
  • black_miracle
  • 2017-01-26 19:21:49
  • 178

SPOJ - TRNGL 卡特兰数

题目链接&amp;lt;https://vjudge.net/problem/SPOJ-TRNGL&amp;gt;题意:给一个n边的凸多边形,用n-3条不相交的线将图形分为n-2个三角形,问有多少种分...
  • monochrome00
  • monochrome00
  • 2018-04-17 19:26:10
  • 7

SPOJ 23336 TRNGL - Make Triangle(dp)

Description 给出一个n个顶点的凸多边形,问三角剖分数量 Input 第一行一整数T表示用例组数,每组用例输入一个整数n表示该凸多边形的点数(1...
  • V5ZSQ
  • V5ZSQ
  • 2017-07-15 17:23:23
  • 173

ACM新生培训开始啦

一年一度的纳新已经基本结束,人员也稳定下来。这学期从10.28开始集训,第一堂课程由我讲起。课堂设计了三个问题,由学生自由发挥回答,我做点评。“编程语言和外语哪个更难学?”、“含有计算机程序的机器更聪...
  • u012976167
  • u012976167
  • 2013-11-27 18:55:24
  • 192

acm选拔赛题目

  • 2014年01月29日 12:30
  • 3.43MB
  • 下载

SPOJ TRNGL Make Triangle && CodeForces 550D Regular Bridge

SPOJ TRNGL Make Triangle CodeForces 550D Regular Bridge
  • Yancy_
  • Yancy_
  • 2017-02-05 15:55:16
  • 181

SPOJ - Make Triangle - 数学

Make Triangle 题目链接 分类:数学 1.题意概述 给出一个凸n边形,问用n-3条不相交的对角线将该n边形划分为三角形的方案数? 2.解题思路 卡特兰数:h(n)=h(0)⋅...
  • dragon60066
  • dragon60066
  • 2017-07-13 12:00:19
  • 73

2016中北大学ACM程序设计新生赛题解

中北大学新生赛题解
  • lxworld123
  • lxworld123
  • 2016-12-22 17:00:31
  • 1028
收藏助手
不良信息举报
您举报文章:新生选拔二 - Make Triangle SPOJ - TRNGL (卡特兰数)
举报原因:
原因补充:

(最多只允许输入30个字)