一座山的山稜线由许多片段的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的更多相关文章

  1. [LeetCode] The Skyline Problem 天际线问题

    A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...

  2. UVALive - 4108 SKYLINE[线段树]

    UVALive - 4108 SKYLINE Time Limit: 3000MS     64bit IO Format: %lld & %llu Submit Status uDebug ...

  3. [LeetCode] The Skyline Problem

    A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...

  4. [地图SkyLine二次开发]框架(5)完结篇

    上节讲到,将菜单悬浮到地图上面,而且任何操作都不会让地图把菜单盖住. 这节带大家,具体开发一个简单的功能,来了进一步了解,这个框架. 1.想菜单中添加按钮 -上节定义的mainLayout.js文件里 ...

  5. [地图SkyLine二次开发]框架(2)

    上节讲到,地图加载. 但我们可以发现,当没有页面布局的情况下,<OBJECT>控件,没有占满整个屏幕,这里我们就要用到Extjs的功能了. 这节要讲的是用Extjs为<OBJECT& ...

  6. [地图SkyLine二次开发]框架(1)

    项目介绍: 项目是三维地理信息系统的开发,框架MVC4.0 + EF5.0 + Extjs4.2 + SkyLine + Arcgis,是对SkyLine的二次开发. 项目快结束了,先给大家看一眼效果 ...

  7. 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 ...

  8. The Skyline Problem

    A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...

  9. [LA4108]SKYLINE

    [LA4108]SKYLINE 试题描述 The skyline of Singapore as viewed from the Marina Promenade (shown on the left ...

随机推荐

  1. Python_装饰器复习_30

    复习: # 装饰器的进阶 # functools.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数# 周末的作业 # 文件操作 # 字符串处理 # 输入输出 # 流程控制 # 装饰器# 开 ...

  2. 割顶树 BZOJ1123 BLO

    无向图中,求去掉点x[1,n]后每个联通块的大小. 考虑tarjan求bcc的dfs树,对于每个点u及其儿子v,若low[v]<prv[u],则v对u的父亲联通块有贡献,否则对u的子树有贡献.每 ...

  3. Day5 Pyhton基础之编码与解码(四)

    1.编码与解码 1.1现在常用的编码类型

  4. Vue2.0 搭建Vue脚手架(vue-cli)

    介绍 Vue.js是一套构建用户界面的渐进式框架.Vue 只关注视图层,采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 阅读之前需要了解的知 ...

  5. 理解ORM的前提:数据库中的范式和约束

    理解ORM的前提:数据库中的范式和约束 一.数据库中的范式: 范式, 英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出 ...

  6. [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)

    Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...

  7. AngularJS双向数据绑定

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. 手机浏览器 - 如何消除<a>标签在点击时的蓝色底色?

    为a标签设置这个样式: a{-webkit-tap-highlight-color:transparent};

  9. python爬虫之Beautiful Soup的基本使用

    1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...

  10. python之路--初识html前端

    一.HTML文档结构 最基本的HTML文档: <!DOCTYPE html> <html lang="zh-CN"> #这个lang表示语言,zh-CN是中 ...