题目描述:给定一个正N边形,可以通过连线将这个多边形分割成N-2个三角形,问这N-2个三角形中恰有k个等腰三角形的分割方法有多少?这个值可能很大,输出对9397取模的结果。
数据范围:n,k <= 50.

这道题也是区间DP,不过稍微难一点。

首先我们先想个办法判断等腰三角形,因为这是一个正多边形,所以我们对于三个点,我们可以计算一下他们的差的绝对值,直接比较这个是否相同即可。

之后就是怎么DP了,想到刚才的三角划分,这题应该也是一道区间DP。令dp[i][j][k]表示在区间i~j之内划分出k个等腰三角形的方案数,之后我们枚举一下端点,判断一下新的断点能否形成等腰三角形进行转移。

这样的复杂度是O(n3*k2)的,会超时,我们考虑优化。因为这是一个正多边形,所以我们可以直接用dp[i][j]表示把以i个连续点为顶点的正多边形划分出j个等腰三角形的方案数。之后直接枚举从几个连续点的位置断开进行转移即可,这样复杂度被优化到了O(n2k2),可以过。

如果不大理解的话,可以结合凸多边形三角划分这道题想一想。

看一下代码。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#include<queue>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n') using namespace std;
typedef long long ll;
const int M = ;
const ll INF = ;
const int mod = ; int read()
{
int ans = ,op = ;
char ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') op = -;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
return ans * op;
} int n,k,dp[][]; bool judge(int x,int m)
{
int ta = min(x - ,n - x + ),tb = min(m - ,n - m + ),tc = min(m - x,n - m + x);
return (ta == tb || tb == tc || ta == tc);
} int dfs(int n,int k)
{
if(dp[n][k] != -) return dp[n][k];
if(n <= ) return ;
int cur = ;
rep(x,,n-)
{
rep(j,,k-judge(x,n)) cur += dfs(x,j) * dfs(n-x+,k-j-judge(x,n)),cur %= mod;
}
return dp[n][k] = cur;
} int main()
{
n = read(),k = read();
memset(dp,-,sizeof(dp));
dp[][] = ;
printf("%d\n",dfs(n,k));
return ;
}

最新文章

  1. 如何获取ResultSet的行数和列数
  2. Javascript知识点记录(二)
  3. x01.BitmapHelper:图像处理
  4. Visual Studio 2013 and .NET 4.6
  5. Android常见工具类封装
  6. Android 用MediaCodec实现视频硬解码
  7. SKPhysicsJointSliding类
  8. Tomcat目录下的各个文件夹的作用
  9. [置顶] Vector ArrayList区别剖析
  10. node里面的c/c++模块
  11. 优化 or 语句
  12. Java基础总结3
  13. C# 继承、虚方法、方法重载和多态
  14. zooland 新开源的RPC项目,希望大家在开发的微服务的时候多一种选择,让微服务开发简单,并且容易上手。
  15. Android Things专题 1.前世今生
  16. Android Intent之Action应用
  17. python之路----模块调用
  18. GCC、GNU C、C99、ANSI C
  19. ADF控件ID变化引发JS无法定位控件的解决方法
  20. Python接口测试实战3(下)- unittest测试框架

热门文章

  1. Fast I/O 模板
  2. Peter Norvig:十年学会编程
  3. Python爬虫简单实现之Q乐园图片下载
  4. 三联动 支持ie6,ie7 省,市,区
  5. 一种client同步server数据的方案
  6. 基于bootstrap_博客页面
  7. MVC 基于FormsAuthentication 方式的权限验证
  8. 基于node+koa2+mongodb实现简单的导航管理系统
  9. Mysql性能优化笔记
  10. xamarin.Android 实现横向滚动导航