一座山的山稜线由许多片段的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. Linux查看端口

    1.lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000   2.netstat -tunlp |grep 端口号 用于查看指定的端口号的进程情况 ...

  2. 使用insert ignore来避免向数据库重复插入数据

    mysql中 insert ignore 的使用示例如下: INSERT IGNORE INTO `table_name` (`reportid`, `content`) VALUES (‘11111 ...

  3. ibatis实战之插入数据(自动生成主键)

    ibatis实战之插入数据(自动生成主键) --------- 如果你将数据库设计为使用自动生成的主键,就可以使用ibatis的<selectKey>元素(该元素是<insert&g ...

  4. linux中mariadb的安装

    在Linux中mariaDB的安装 MariaDB其实就是MySQL的分支,是为了应对MySQL的即将的闭源风险所产生的. Linux系统中软件包的格式为mysql.rpm格式. 通过yum去安装 L ...

  5. html总结:背景图片拉伸

    两种方法: ⑴推荐方法 <style>body {background-image:url(images/backimage.jpg);background-size:cover;}< ...

  6. React不同版本之间需要注意的地方

    React Fiber react fiber指的是react16.0机器之后的版本,相对于之前的版本来说,这一个版本的更新做了很多的优化,所以和之前的版本中的用法可能会发生不同,所以,平常开发中,主 ...

  7. 【问题解决方案】Git bash进入多层子目录问题(通配符问题留坑)

    cd进入指定路径下:cd 斜杠 斜杠 方法一: 1- 撇丿,不是"那",盘符前面要加上 / (d盘前面也加,不加也行) 2- 路径名不区分大小写 3- 不用空格 4- 如果目录名中 ...

  8. PHP常见错误汇总

    日常开发和调试的时候,经常会遇到一些错误,光怪陆离的不知所以,所以,特此将错误汇总一下,借鉴!!! 1. 原因分析:  一般可能是该文件出现了问题,检查一下代码和格式,是否出现开始的地方出现了空格,或 ...

  9. java随笔5 完整路径的应用

    不仅类,函数,甚至参数都可以获取完整路径

  10. 在linux上安装Scala详细步骤

    scala在linux安装很简单,就是下载,解压,配置环境变量,source一下成功. 提君博客原创 >>提君博客原创 http://www.cnblogs.com/tijun/ < ...