题目链接:CSAPC08台湾邀请赛_T1_skyline

题目描述

一座山的山稜线由许多片段的45度斜坡构成,每一个片段不是上坡就是下坡。
/
/​
* / ​/ * /  // ​/ // / 在我们眼前的所见的任何宽度为n个单位的山稜形状,可以轻松地观察到所有山顶的位置。

请问有多少种山稜线的形状,使得所有山顶的位置由左而右非递减呢?

所有的山稜线都必须完整,也就是说左右两端都必须是高度为0的山脚,而且不能有任何山谷的位置隐没在地平线底下。

输入输出格式

输入格式

输入仅包含一个数字n,n一定会是偶数,因为会有相同片段数量的上坡以及下坡。

输出格式

请输出山顶位置由左而右非递减的山稜线形状总数。
由于答案可能很大,你只要输出以十进位表示时,它的最后9位数即可。

样例

INPUT

6

OUTPUT

4

HINT

佔总分20%的测试数据中 n<=60

佔总分40%的测试数据中 n<=200

佔总分100%的测试数据中 n<=3000

SOLUTION

这题考场上耗了我大半的时间还没搞出来qwq。

首先,根据题意分析,很容易就能看出这是个区间dp。

区间dp怎么传递呢?看到题目要求:求宽度为\(n\),山顶高度非降的方案和。所以我们可以开一个二维数组\(dp[i][j]\)记录答案:第一维\(i\)用来记录限定条件:“宽度”;第二维\(j\)来记录限定条件:这些山峰的最高高度\(j\),以便转移。

但是啊,我们的\(dp\)数组只能记录最高高度为\(j\)的情况,那如果我要拓宽宽度的话,肯定是不能再把所有的最高高度的情况又重新枚举累加的,所以考虑用一个前缀和数组\(sum[i][j]\)来记录宽度为\(i\),最高高度限定为\(j\)(可以小于\(j\))的所有情况,可以说\(sum\)数组就是把宽度为\(i\)的所有合法情况记录了下来。

接下来就是转移了。

首先我们有两大种情况:
Ⅰ.我们的\(dp[i][j]\)的情况可以直接由\(dp[i-1][j-1]\)的情况得到;
这就相当于可以想象把\(dp[i-1][j-1]\)中包含的山的情况整体往上拱了一层。如下图:

Ⅱ.我们也可以通过在\(sum[i-2][j]\)的基础上加上一座最小的山。如下图:

因为\(sum[i-2][j]\)加上一座单位高度的小山已经把类似于最低山的高度大于单位长度的所有情况考虑了进来,而我们的情况Ⅰ就是对应着这种“最低山的高度大于单位长度”的所有情况。

所以任何情况已经可以用以上两种情况相互叠加着表示,可以保证的是这么算目前已经没有遗漏了。

但其实还会存在一个小问题。

在整体宽度为\(i+j\)时,假设我们的右边有一座高度为\(j\)的山峰,那么显然地,这座山峰的宽度为\(2j\),所以去掉右边的山峰后,我们左边部分的山峰宽度为\(i-j\),那么我们的\(sum[i-2j][j]\)就可以表示当前说的这种情况的所有方案,此时是合法的。

不过我们若将左边部分的宽度减少一个单位匀给右边部分,右边部分一定不能在保持只有一座山峰的情况下保证最高高度为\(j\),所以不合法。

但是可能会有点想不通的是:为什么右边就一定只能有一座山峰呢?

其实,注意一下我们的转移方程,我们的\(sum[i-2][j]\)是通过和一个单位高度的山峰组合在一起作为答案加进我们的\(dp\)数组里去的,然后当我们的单位高度小山峰被垫高到了高度\(j\)时,与它同组搭配的\(sum\)数组的组合情况就必须考虑一下其合法性了,因为这种非法组合也本来就不能算在答案里。于是考虑删除。

代码就在下面,这篇题解其实更多就是对下面的代码的解释因为这个标程一点注释都没有啊。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int N=3010;
const int P=1000000000;
int n,dp[N][N],sum[N][N];
int main(){int i,j;memset(dp,0,sizeof(dp));memset(sum,0,sizeof(sum));dp[1][1]=1;sum[1][1]=1;for (i=2;i<=3000;++i){for (j=1;j<i;++j){if ((i+j)%2==0){dp[i][j]=(dp[i-1][j-1]+sum[i-2][j])%P;if (i-j-j>0) {dp[i][j]=(dp[i][j]-sum[i-j-j-1][j]+P)%P;}}sum[i][j]=(sum[i-1][j]+dp[i][j])%P;}dp[i][i]=1;sum[i][i]=1;}while (scanf("%d",&n)!=EOF){int ans=0;for (i=1;i<=n/2;++i) {ans=(ans+dp[n-i][i])%P;}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/hkpls/p/9804095.html

CSAPC08台湾邀请赛_T1_skyline相关推荐

  1. 走近棒球运动·台湾棒球历程·MLB棒球创造营

    棒球运动在中国台湾省的发展已有百余年历史.在台湾日据时期的发展阶段(1897年-1945年),棒球运动具有浓厚的殖民主义色彩:战后初期(1945年~1960年代)民生困苦,观赏棒球逐渐发展成庶民生活的 ...

  2. 台湾前十大科技公司拼不过三星(往后一点三星都不要买啦!)

    台湾前十大科技公司拼不过三星,往后一点三星都不要买啦!本来还可以买它的内存和液晶,不过现在是一点都不能买了,再买就真反了他了! 三星像糖果也像毒药,让台湾LED类股1年涨3倍,但也让鸿海市值一夜之间消 ...

  3. 台湾MCI报告:Security SaaS风潮渐起

    这篇文章是台湾产业情报研究所(MCI)在2008年所作的一份有关Security-as-a-Serivce(Security SaaS,为了区别Software-as-a-Serivce,特称呼为Se ...

  4. 【组队学习】【24期】河北邀请赛(二手车价格预测)

    河北邀请赛(二手车价格预测) 开源内容: https://github.com/datawhalechina/team-learning-data-mining/tree/master/SecondH ...

  5. 【直播】王茂霖:二手车交易价格预测-千变万化特征工程(河北高校数据挖掘邀请赛)

    二手车交易价格预测-千变万化特征工程 目前 河北高校数据挖掘邀请赛 正在如火如荼的进行中.为了大家更好的参赛,王茂霖分享了 从0梳理1场数据挖掘赛事!,完整梳理了从环境准备.数据读取.数据分析.特征工 ...

  6. 【直播】王茂霖:二手车交易价格预测 Baseline 提高(河北高校数据挖掘邀请赛)

    二手车交易价格预测 Baseline 提高 目前 河北高校数据挖掘邀请赛 正在如火如荼的进行中.为了大家更好的参赛,王茂霖分享了 从0梳理1场数据挖掘赛事!,完整梳理了从环境准备.数据读取.数据分析. ...

  7. 【直播】鱼佬:数据挖掘师之路(河北高校数据挖掘邀请赛)

    数据挖掘师之路 目前 河北高校数据挖掘邀请赛 正在如火如荼的进行中.为了大家更好的参赛,王茂霖分享了 从0梳理1场数据挖掘赛事!,完整梳理了从环境准备.数据读取.数据分析.特征工程到数据建模的整个过程 ...

  8. 河北省高校数据挖掘邀请赛来了!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale-河北 组织方:阿里云天池.Datawhale 鉴于疫情的影响,不少河北高校已 ...

  9. 2019 ICPC全国邀请赛(西安)I. Cracking Password(序列检验,BSGS,细节题)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2019 ICPC全国邀请赛(西安)I. Cracking Password Weblink http ...

最新文章

  1. 5位最具影响力的程序员
  2. Roguelike游戏的视野算法
  3. ARM指令中STM和LDM的理解误区
  4. Linux学习笔记2-文件读写操作
  5. 第二阶段个人冲刺08
  6. 每日一笑 | 在俄罗斯人眼里,没有什么是胶带解决不了的
  7. ThoughtWorks洞见领域驱动设计思维导图笔记
  8. 输入问题C++字符数组越界问题的一个案例分析
  9. 高等数学(第七版)同济大学 习题3-2 个人解答
  10. 探索ESP8285(1)搭建arduino开发ESP8285环境搭建
  11. 新网漫时代下的国漫“哥伦布”征程
  12. 电力拖动自动控制系统 华南理工大学期末重点 阮毅 长篇思维导图
  13. 微信授权登陆服务器,微信公众号开发流程--微信第三方授权登陆流程
  14. SCI、EI、IEEE、检索网站的区别
  15. 检查并杀死mysql锁死的进程
  16. promise,回调地狱
  17. 豆瓣2022年度影视资源榜单合集,速度保存!
  18. matlab阻尼震动论文,基于MATLAB的平方阻尼振动研究
  19. 敏捷结果30天之第三天:一日之计在于晨
  20. JavaScript 模块化介绍

热门文章

  1. Jar/War/Ear等包的作用与区别详解
  2. 用XFTP向Linux上传文件时出现Permission is not allowed
  3. TCL(Tool   Command   Language)
  4. C# 获取 ipv4的方法
  5. 使用libcurl开源库和Duilib做的下载文件并显示进度条的小工具
  6. 多台服务器通过ssh 无密钥直接登陆主机
  7. 【逆天的算法】这几首宋词,你能看出来是出自计算机之手吗?
  8. Eclipse安装hibernate插件的问题
  9. 打造轻量化的View Controller
  10. tuxedo相关概念