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 ...
随机推荐
- H5 id选择器
09-id选择器 迟到毁一生 早退穷三代 按时上下班 必成高富帅 <!DOCTYPE html> <html lang="en"> <head> ...
- elk之查询方式(4种)
es 在查询时, 可以指定搜索类型为下面四种: QUERY_THEN_FETCH QUERY_AND_FEATCH DFS_QUERY_THEN_FEATCH DFS_QUERY_AND_FEATCH ...
- Linux下设置MySql自动启动
https://www.cnblogs.com/sunny3096/p/7954146.html
- java语句中的重定向函数
重定向后面就不能转发了,所以return null
- MyBatis映射文件6
之前说了由Employee找Department,这一节讲一讲由Department找Employee,显然前者是多对一的关系,而后者是一对多的关系. Department的JavaBean: pri ...
- Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念(转)
PO(persistant object) 持久对象 在 o/r 映射的时候出现的概念,如果没有 o/r 映射,没有这个概念存在了.通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的处理.可以 ...
- jackson使用问题:mapper.readValue()将JSON字符串转反序列化为对象失败或异常
问题根源:转化目标实体类的属性要与被转JSON字符串总的字段 一 一对应!字符串里可以少字段,但绝对不能多字段. 先附上我这段出现了问题的源码: // 1.接收并转化相应的参数.需要在pom.xml中 ...
- 安装使用阿里云的yum源
CentOS 1.备份(备份本地Yum源) mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2.下 ...
- git 提交顺序
0. git branch # 查看自己是哪个分支:先确定自己现在是哪个分支 1. git fetch # 将远程主机的更新,全部取回本地.如果只想取回特定分支的更新,可以指定分支名:git ...
- LODOP打印css样式rgba显示黑色区块
当LODOP打印html超文本出现问题的时候,要删减排查一下样式,查看Lodop传入的内部的html超文本和样式,可查看本博客另一篇博文:删减发现有问题的样式,并解决该问题,尽量使用通用的css样式, ...