CSAPC2008 skyline
一座山的山稜线由许多片段的45度斜坡构成,每一个片段不是上坡就是下坡。
*
* * /\
* /\ /\/ \
/\/ \/ \
在我们眼前的所见的任何宽度为n个单位的山稜形状,可以轻松地观察到所有山顶的位置。
请问有多少种山稜线的形状,使得所有山顶的位置由左而右非递减呢?
所有的山稜线都必须完整,也就是说左右两端都必须是高度为0的山脚,而且不能有任何山谷的位置隐没在地平线底下。
输入说明 :
输入仅包含一个数字n,n一定会是偶数,因为会有相同片段数量的上坡以及下坡。
输出说明 :
请输出山顶位置由左而右非递减的山稜线形状总数。
由于答案可能很大,你只要输出以十进位表示时,它的最后9位数即可。
范例输入 :
6
范例输出 :
4
提示 :
佔总分20%的测试数据中 n<=60
佔总分40%的测试数据中 n<=200
佔总分100%的测试数据中 n<=3000
题解:
动态规划
记dp[i][j]表示长度为i+j,山稜最大高度为j时的方案数,那么它可以由以下两种状态转移过来。
1)dp[i-1][j-1](在原图形的两侧分别加上一条线,如下图)

2)之前已经存在了的最大高度为j的山峰,在左边补上高度比它小的山峰而形成的,如下图

我们将情况2)通过一个前缀和数组sum[i][j]表示(表示长度不超过i+j且高度为j的方案数)
那么状态转移方程即为:dp[i][j]=dp[i-1][j-1]+sum[i-2][j],
sum[i][j]=sum[i-1][j]+dp[i][j]
为了保证合法则必须有(i+j) mod 2=0
那么这题是不是结束了?并没有
在情况2)中,我们直接加上了sum[i-2][j],这样做有什么问题吗?
我们考虑下面的图

对于左面新添加的山稜,为了保证答案的合法,只能在它的旁边加上高度不超过当前最大高度的山稜,即下面的转移是不合法的

但是如果我们只是单纯的加上sum[i-2][j]是无法解决上面所提到的不合法的情况
即:我们在转移完了之后,要减去一部分不合法的情况
这些不合法的情况是:长度小于i-j,高度为j的所有山稜
所以在转移完成之后需要将sum[i-j-j-1][j]减去即可
最后答案:
程序:
#include <stdio.h>
#include <iostream>
using namespace std;
const int maxd=;
int dp[][]={};
int sum[][]={};
int main() {
int n,i,j,s;
dp[][] = ;
sum[][] = ;
for( i=; i<=; i++ ) {
for( j=; j<i; j++ ) {
if((i+j)%==) {
dp[i][j] = (dp[i-][j-]+sum[i-][j])%maxd;
if(i-j-j->=) {
dp[i][j] = (dp[i][j]-sum[i-j-j-][j])%maxd;
if(dp[i][j]<) dp[i][j]+=maxd;
}
}
sum[i][j] = (sum[i-][j]+dp[i][j])%maxd;
}
dp[i][i] = ;
sum[i][i] = ;
}
scanf("%d",&n);
s = ;
for( i=; i<=n/; i++ ) {
s = (s+dp[n-i][i])%maxd;
}
printf("%d\n",s);
return ;
}
CSAPC2008 skyline的更多相关文章
- [LeetCode] The Skyline Problem 天际线问题
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
- UVALive - 4108 SKYLINE[线段树]
UVALive - 4108 SKYLINE Time Limit: 3000MS 64bit IO Format: %lld & %llu Submit Status uDebug ...
- [LeetCode] The Skyline Problem
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
- [地图SkyLine二次开发]框架(5)完结篇
上节讲到,将菜单悬浮到地图上面,而且任何操作都不会让地图把菜单盖住. 这节带大家,具体开发一个简单的功能,来了进一步了解,这个框架. 1.想菜单中添加按钮 -上节定义的mainLayout.js文件里 ...
- [地图SkyLine二次开发]框架(2)
上节讲到,地图加载. 但我们可以发现,当没有页面布局的情况下,<OBJECT>控件,没有占满整个屏幕,这里我们就要用到Extjs的功能了. 这节要讲的是用Extjs为<OBJECT& ...
- [地图SkyLine二次开发]框架(1)
项目介绍: 项目是三维地理信息系统的开发,框架MVC4.0 + EF5.0 + Extjs4.2 + SkyLine + Arcgis,是对SkyLine的二次开发. 项目快结束了,先给大家看一眼效果 ...
- Java for LeetCode 218 The Skyline Problem【HARD】
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
- The Skyline Problem
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
- [LA4108]SKYLINE
[LA4108]SKYLINE 试题描述 The skyline of Singapore as viewed from the Marina Promenade (shown on the left ...
随机推荐
- Python_装饰器复习_30
复习: # 装饰器的进阶 # functools.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数# 周末的作业 # 文件操作 # 字符串处理 # 输入输出 # 流程控制 # 装饰器# 开 ...
- 割顶树 BZOJ1123 BLO
无向图中,求去掉点x[1,n]后每个联通块的大小. 考虑tarjan求bcc的dfs树,对于每个点u及其儿子v,若low[v]<prv[u],则v对u的父亲联通块有贡献,否则对u的子树有贡献.每 ...
- Day5 Pyhton基础之编码与解码(四)
1.编码与解码 1.1现在常用的编码类型
- Vue2.0 搭建Vue脚手架(vue-cli)
介绍 Vue.js是一套构建用户界面的渐进式框架.Vue 只关注视图层,采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 阅读之前需要了解的知 ...
- 理解ORM的前提:数据库中的范式和约束
理解ORM的前提:数据库中的范式和约束 一.数据库中的范式: 范式, 英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出 ...
- [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...
- AngularJS双向数据绑定
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 手机浏览器 - 如何消除<a>标签在点击时的蓝色底色?
为a标签设置这个样式: a{-webkit-tap-highlight-color:transparent};
- python爬虫之Beautiful Soup的基本使用
1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...
- python之路--初识html前端
一.HTML文档结构 最基本的HTML文档: <!DOCTYPE html> <html lang="zh-CN"> #这个lang表示语言,zh-CN是中 ...