题目链接

题意:把一个正多边形分成数个三角形或者四边形,问有多少种方案。

题解:

如果分出的全为三角形的话,那就是正多边形三角剖分问题。它的结果就是Catalan数。现在也可以划分出四边形的话,可以采用动态规划策略。具体如下:

将n边形的顶点按顺时针或逆时针编号为1,2,3....n(n>=3),设T(n)为最终的结果,E(i,j)为i号顶点和j号顶点连成的对角线(1<=i<j<=n),我们定义T(2)=1.分两种情况讨论:
(1)边E(1,n)为划分后一个三角形的一条边。i为该三角形的另外一个顶点(2<=i<=n-1),因此,对角线E(1,i)和对角线E(i,n)将n边形分为1个i边形,1个由顶点(1,i,n)组成的三角形,1个(n-i+1)边形;这种情况下,问题规模缩小为小i边形,和(n-i+1)边形的。此时的种数为:
                 a=∑T(i)*T(n-i+1)   (2<=i<=n-1)
(2)边E(1,n)为划分后一个四边形的一条边。i,j为该四边形的另外两个顶点(2<=i<=n-2,i+1<=j<=n-1)。1,n,i,j四个顶点将n边形分为1个i边形,1个j-i+1边形,1个n-j+1边形和该四边形。我们可以继续将i边形,j-i+1,n-j+1边形继续划分,规模也将继续缩小。此时的种数为:
                 b=∑∑T(i)*T(j-i+1)*T(n-j+1); (2<=i<=n-2,i+1<=j<=n-1)
故T(n)=a+b=∑T(i)*T(n-i+1)+∑∑T(i)*T(j-i+1)*T(n-j+1);
此时的时间复杂度为O(n^3),会TLE,我们可以将上述表达式写成以下形式以降低时间复杂度 
                 U(n)=∑T(i)*T(n-i+1);(2<=i<=n-1)
                 T(n)=U(n)+∑T(i)*U(n-i+1);(2<=i<=n-2)
这样我们可以获得O(n^2).

关于对结果的取余,unsigned long long是自动对2^64取余的。

#include <cstdio>
using namespace std;
const int maxn=5005;
unsigned long long a[maxn],b[maxn];
unsigned long long n;
void init()
{for(int i=0;i<3;i++){a[i]=1;b[i]=1;}for(int i=3;i<=5000;i++){a[i]=0;for(int j=2;j<=i-1;j++)a[i]=a[i]+b[j]*b[i-j+1];b[i]=a[i];for(int j=2;j<=i-2;j++)b[i]=b[i]+b[j]*a[i-j+1];}
}
int main()
{init();while(scanf("%llu",&n)!=EOF)printf("%llu\n",b[n]);return 0;
}

转载于:https://www.cnblogs.com/Ritchie/p/5939844.html

POJ 3597 Polygon Division (DP)相关推荐

  1. poj 1185(状压dp)

    题目链接:http://poj.org/problem?id=1185 思路:状态压缩经典题目,dp[i][j][k]表示第i行状态为j,(i-1)行状态为k时最多可以放置的士兵个数,于是我们可以得到 ...

  2. poj 2948 Martian Mining (dp)

    http://poj.org/problem?id=2948 意:一个row*col的矩阵,每个格子内有两种矿yeyenum和bloggium,并且知道它们在每个格子内的数量是多少.如图所示,最北边有 ...

  3. [POJ 1742] Coins 【DP】

    题目链接:POJ - 1742 题目大意 现有 n 种不同的硬币,每种的面值为 Vi ,数量为 Ni ,问使用这些硬币共能凑出 [1,m] 范围内的多少种面值. 题目分析 使用一种 O(nm) 的 D ...

  4. poj 3254 状压dp

    E - Corn Fields Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  5. POJ 1088----滑雪(DP)

    原题连接:http://poj.org/problem?id=1088 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  6. POJ 1692 Crossed Matchings dp[][] 比较有意思的dp

    http://poj.org/problem?id=1692 这题看完题后就觉得我肯定不会的了,但是题解却很好理解.- - ,做题阴影吗 所以我还是需要多思考. 题目是给定两个数组,要求找出最大匹配数 ...

  7. POJ 1015 Jury Compromise dp分组

    第一次做dp分组的问题,百度的~~ http://poj.org/problem?id=1015 题目大意:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑 ...

  8. poj 1088 滑雪 (dp)

    题目链接 题意就不多解释了,题目思路很简单,搜索就行了,但是暴搜会TLE,但是对于每一个dfs(X, Y),如果参数一样的话结果也是一样的,我们用一个二维数组去保存每次计算的位置的结果,最后从所有的解 ...

  9. Corn Fields(POJ 3254状压dp)

    题意: n*m网格1能放0不能放 放的格子不能相邻 求一共多少种可放的方案. 分析: dp[i][j]第i行可行状态j的的最大方案数,枚举当前行和前一行的所有状态转移就行了(不放牛也算一种情况) #i ...

  10. POJ - 1661 Help Jimmy DP

    题目链接 题意:题意很明了,就是求从最高点最短多长时间到达地面,从板上的移动与空中下落的速度都是1: 做法:我们首先将所有的板子与起点按照,左.右端点,高度存起来,按照高度升序. 然后dp,设dp[i ...

最新文章

  1. android 显示 PDF 文件
  2. 深入探讨用位掩码代替分支(7):MMX指令集速度测试
  3. 二分类排斥子和鞍点的准确率的表达式pa
  4. Html 教程 (1)简介
  5. Sybase identity 字段
  6. SpringCloud(Gateway网关使用)
  7. php防止快速刷新代码(分享)_php防止网站被刷新的方法汇总
  8. mysql @符号_MySQL 数值类型
  9. 正在导出系统过程对象和操作 卡住_开会时CPU 飙升100%同事们都手忙脚乱记一次应急处理过程
  10. java 浅堆 深堆_JVM中的一个小知识点:深堆和浅堆的概念
  11. python sorted .sort()
  12. kingdee kis
  13. C++学习笔记(二)——构造函数和析构函数
  14. 写了一个很矬( cuó)的移动端用户管理
  15. php针式打印机打多张,如何将多页内容打印在一张A4纸上
  16. dm连接mysql_DM数据库JDBC连接
  17. Android手机型号及产品名
  18. DOS远程桌面连接命令
  19. excel中的stdev和stdevp的区别等系列
  20. Windows Server执行定时任务

热门文章

  1. vscode插件之php插件koroFileHeader(自动生成注释)
  2. 阿里云ddns解决动态IP问题
  3. webapi 状态返回 php,让WebAPI 返回JSON格式的数据实例教程
  4. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_20-页面静态化-静态化测试-填写页面DataUrl...
  5. 小D课堂 - 新版本微服务springcloud+Docker教程_3-07 Eureka服务注册中心配置控制台问题处理...
  6. 阶段3 3.SpringMVC·_07.SSM整合案例_09.ssm整合之Spring整合MyBatis框架配置事务
  7. 使用octave符号运算求解不定积分、微分方程等(兼容matlab)
  8. linux下安装redis 3.2.1
  9. base64编码的图片字节流存入html页面中的显示
  10. CSS3 Transform 变形