zoukankan      html  css  js  c++  java
  • Codeforces 437E The Child and Polygon(间隔DP)

    题目链接:Codeforces 437E The Child and Polygon

    题目大意:给出一个多边形,问说有多少种切割方法。将多边形切割为多个三角形。

    解题思路:首先要理解向量叉积的性质,一開始将给出的点转换成顺时针。然后用区间dp计算。dp[i][j]表示从点i到点j能够有dp[i][j]种分割方法。然后点i和点j能否够做为分割线。要经过推断。即在i和j中选择的话点k的话,点k要在i,j的逆时针方。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    typedef long long ll;
    
    const int N = 205;
    const ll MOD = 1e9+7;
    
    struct point {
        ll x, y;
        ll operator * (const point& c) const {
            return x * c.y - y * c.x;
        }
        point operator - (const point& c) const {
            point u;
            u.x = x - c.x;
            u.y = y - c.y;
            return u;
        }
    }p[N];
    int n;
    ll dp[N][N];
    
    void init () {
        scanf("%d", &n);
        memset(dp, -1, sizeof(dp));
    
        for (int i = 0; i < n; i++)
            scanf("%lld %lld", &p[i].x, &p[i].y);
    
        ll tmp = 0;
        p[n] = p[0];
        for (int i = 0; i < n; i++)
            tmp += p[i] * p[i+1];
    
        if (tmp < 0)
            reverse(p, p + n);
    }
    
    ll solve (int l, int r) {
        if (dp[l][r] != -1)
            return dp[l][r];
    
        ll& ans = dp[l][r];
        ans = 0;
    
        if (r - l == 1)
            return ans = 1;
    
        for (int i = l + 1; i < r; i++) {
            if ((p[l] - p[r]) * (p[i] - p[r]) > 0)
                ans = (ans + solve(l, i) * solve(i, r)) % MOD;
        }
        return ans;
    }
    
    int main () {
        init();
        printf("%lld
    ", solve(0, n-1));
        return 0;
    }
  • 相关阅读:
    VMware安装Ghost版Win10 失败的解决方法
    供销平台能导入不能编辑商品的问题
    bootstrap导航菜单做active判断
    phantomjs读取文件转换数组
    网址收藏
    清理恶意绑定浏览器网址
    sort
    论文等级
    multiThreading
    LZ4压缩算法
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5035787.html
Copyright © 2011-2022 走看看