博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LA 4123 (计数 递推) Glenbow Museum
阅读量:5156 次
发布时间:2019-06-13

本文共 1403 字,大约阅读时间需要 4 分钟。

题意:

这种所有边都是垂直或水平的多边形,可以用一个字符串来表示,一个270°的内角记作O,一个90°的内角记作R。

如果多边形内存在一个点,能看到该多边形所有的点,则这个多边形对应的序列是合法的。这里长度不作限制,只要长度适当能满足要求即可。

现给出序列长度,问有多少种序列符合要求。

分析:

书上分析地很清楚,罗列一下要点:

首先对于一个长度为n的合法序列,R的个数为(n+4)/2,O的个数为(n-4)/2,即R比O多4个

我们要找的序列满足要求:R比O多4个,没有两个O相邻。

这里先设计了一个O(n2)递推的状态,很好理解,看下面那个O(n)的递推

f(i, j, k)表示有i个R,有j对相邻的R,k(k=0表示R,k=1表示O)开头,R结尾的序列个数。

边界:

f(1, 0, 0) = 1,对应串R;f(1, 0, 1) = 1,对应串OR

状态转移方程:

f(i, j, k) = f(i-1, j, k) + f(i-1, j-1, k),第一个代表在最后面加OR,第二个表示在最后面加R

答案:

f((n+4)/2, 3, 0) + f((n+4)/2, 4, 1) + f((n+4)/2, 4, 0)

第一个表示开头结尾都是R的串,串中有3对相邻的R,因为串是环状的,所以首尾也算一对,共4对R

第二个是O开头,R结尾的串

第三个看起来是R开头结尾,而且中间还有4对R,但只要在最后加上一个O就行了,这样不影响R的个数,对数,总之不影响整个状态的表示。

1 #include 
2 3 const int maxn = 1000; 4 5 long long d[maxn + 10][5][2], ans[maxn + 10]; 6 7 void Init() 8 { 9 d[1][0][1] = d[1][0][0] = 1;10 for(int i = 2; i <= maxn; i++)11 for(int j = 0; j < 5; j++)12 for(int k = 0; k < 2; k++)13 {14 d[i][j][k] = d[i-1][j][k];15 if(j) d[i][j][k] += d[i-1][j-1][k];16 }17 18 for(int i = 4; i <= maxn; i+= 2)19 {20 int R = (i>>1) + 2;21 ans[i] = d[R][3][0] + d[R][4][1] + d[R][4][0];22 }23 }24 25 int main()26 {27 Init();28 int n, kase = 1;29 while(scanf("%d", &n) == 1 && n) printf("Case %d: %lld\n", kase++, ans[n]);30 }
代码君

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4319369.html

你可能感兴趣的文章
Linux 下五个顶级的开源命令行 Shell
查看>>
Linux平台中使用PHP让word转pdf
查看>>
03循环结构
查看>>
docker数据卷的使用 -v --volumes--from
查看>>
电磁兼容培训文稿
查看>>
初始化 静态代码块1
查看>>
shell 实现txt转换成html
查看>>
sqlserver 2008修改数据库表的时候错误提示“阻止保存要求重新创建表的更改”...
查看>>
53. (待补) (使用单链表)实现简单的管理系统 MVC 将链表作为内存数据模型,将文件作为数据库,将终端作为交互界面。读文件生成 链表,修改链表写入文件。...
查看>>
【JZOJ4811】【NOIP2016提高A组五校联考1】排队
查看>>
SqlServer数据组织结构
查看>>
HTMLTESTRunner自动化测试报告增加截图功能
查看>>
自定义注解判空简单示例
查看>>
squid,nginx,lighttpd反向代理的区别
查看>>
利用 Apache 为个人用户创建 web 站点及其报错处理
查看>>
java编程思想第四版第十八章总结
查看>>
查询分页
查看>>
C# 读取excel
查看>>
关于单行和多行文本溢出显示省略号的解决方案
查看>>
前端开发工具介绍----合成雪碧图工具(css sprite)
查看>>