3. val
【题目描述】
  这是一道传统题,源代码的文件名为 val.cpp/c/pas。
  有一个值初始为 0,接下来 n 次你可以令其在之前基础上+2 或+1 或-1。你需要保证,这个值在整个过程中达到的最大值减去达到的最小值不大于 k,求方案数,模 1,000,000,007。
【输入格式】
  从 val.in 中读入。
  仅一行,两个空格隔开的正整数 n 和 k。
【输出格式】
  输出到 val.out 中。
  仅一行,一个非负整数,表示方案数对 1,000,000,007 取模后的结果。
【输入样例 A】
3 2
【输出样例 A】
11
【输入样例 B】
233 99
【输出样例 B】
316461264
【评分标准】
对于 10%的数据,n,k<=15;
对于 30%的数据,n,k<=75;
对于 50%的数据,n,k<=300;
对于另 10%的数据,k=1;
对于 100%的数据,n,k<=5,000。
时间限制 2s,空间限制 512MB。

题解:

  这道题我一开始想的是直接O(3n)暴力搜索每一种情况,并记录最大最小值依次判断,但是这样做只能得20分。

  考虑到本题中无后效性的特点,再想一想有最优子结构,于是想到此题正解是DP。

  枚举最小值是 d,则只需要限制达到的值始终在 d 和 d+k 之间,且保证达到过 d 即可,于是每次枚举还需要一个 O(nk)的 dp。注意到这可以认为是从-d 出发,达到的值始终在 0 到k 之间,且保证过达到 0。这样子就不需要枚举 d,直接做一次 dp 就可以了。

  代码(std):

 #include <bits/stdc++.h>
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
#define mo 1000000007
#define N 5005
int n,k,dp[N][N][];
int main()
{
char fni[]="val.in",fno[]="val.out";
freopen(fni,"r",stdin);
freopen(fno,"w",stdout);
scanf("%d%d",&n,&k);
memset(dp,,sizeof(dp));
rep(i,,k) dp[][i][!i]=;
rep(i,,n)
{
rep(j,,k) rep(t,,)
{
if(j>=) (dp[i][j][t]+=dp[i-][j-][t])%=mo;
if(j>=) (dp[i][j][t]+=dp[i-][j-][t])%=mo;
if(j<k) (dp[i][j][t]+=dp[i-][j+][t])%=mo;
}
(dp[i][][]+=dp[i][][])%=mo;
dp[i][][]=;
}
int ans=;
rep(i,,k) (ans+=dp[n][i][])%=mo;
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
}

题解【2.23考试T3】val的更多相关文章

  1. 5.23考试总结(NOIP模拟2)

    5.23考试总结(NOIP模拟2) 洛谷题单 看第一题第一眼,不好打呀;看第一题样例又一眼,诶,我直接一手小阶乘走人 然后就急忙去干T2T3了 后来考完一看,只有\(T1\)骗到了\(15pts\)[ ...

  2. 题解【2.23考试T2】str

    2. str [题目描述] 这是一道传统题,源代码的文件名为 str.cpp/c/pas. 构造 n 个 01 字符串 S1...Sn,使得对于任意 i≠j,Si 不是 Sj 的前缀.在最小化串长和的 ...

  3. 题解【2.23考试T1】div

    1. div[题目描述] 这是一道传统题,源代码的文件名为 div.cpp/c/pas. 给定一棵树,你要判断是否存在一条边,使得割掉这条边后,这棵树被分成了点数相等的两部分,并且如果存在,请你找到这 ...

  4. 题解 2020.10.24 考试 T3 数列

    题目传送门 题目大意 给出一个数 \(n\),你要构造一个数列,满足里面每个数都是 \(n\) 的因子,且每一个数与前面不互质的个数不超过 \(1\).问有多少种合法方案. 保证 \(n\) 的不同质 ...

  5. 2018-8-10考试 T3. 朝暮(akekure)

    题目大意:有$n$个点和$m$条边的图($n - 1 \leq m \leq n + 5$),每个点要么黑要么白,两个黑点不可以相邻,问方案数 题解:可以发现当图为一棵树的时候只需要一个树形$DP$ ...

  6. 2019.2.25考试T3, 离线+线段树

    \(\color{#0066ff}{题解}\) #include<bits/stdc++.h> #define LL long long LL in() { char ch; LL x = ...

  7. 8.23考试总结(NOIP模拟46)[数数·数树·鼠树·ckw的树]

    T1 数数 解题思路 大概是一个签到题的感觉...(但是 pyt 并没有签上) 第一题当然可以找规律,但是咱们还是老老实实搞正解吧... 先从小到大拍个序,这样可以保证 \(a_l<a_r\) ...

  8. 2019.2.14 考试T3 交互题

    \(\color{#0066ff}{ 题目描述 }\) 由于机房被成功拯救了,花_Q很高兴,花_Q生成了一个 0 到 N - 1 的排列(排列的下标从 0 到 N - 1 ).保证排列中 0 在 N ...

  9. 考试T3麻将

    这题就是一个简单的暴力,但考试的时候不知道脑子在想什么,什么都没打出来,也许是我想的太多了... 这道题对于不会打麻将的人来说还是有点难理解规则的,我没说过我会打麻将,这里是题目链接. 20分思路,利 ...

随机推荐

  1. How Many Tables HDU - 1213

    #include<iostream> using namespace std; ; int p[N]; int find(int x) { if(p[x]!=x) p[x]=find(p[ ...

  2. Beamer加入背景图片

    在Beamer中加入背景图片只要把背景重新设置一下: \setbeamertemplate{background}{\includegraphics[height=\paperheight]{bg}} ...

  3. 中软国际首届嘉年华晚会 创新网络年会PK“春晚”

    随着新年脚步的来临,各大公司的年会陆续出炉,但是中软国际的首届嘉年华晚会,以创新网络年会和全国八地同步进行的模式,演绎不一样的互联网年会,简直可以PK“春晚”.IT届中最漂亮的美女热舞,程序员中最会唱 ...

  4. 4级搭建类401-Oracle 19c Non-CDB DG搭建(Linux 主备一对一 LGWR ASYNC)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...

  5. 野路子码农系列(8)我终于大致搞懂了GBDT

    由于下下周要在组里介绍一个算法,最近开始提前准备,当初非常自信地写下自己最喜欢的GBDT,但随着逐步深入,发现其实自己对这个算法的细节并不是非常了解,了解的只是一些面试题的答案而已……(既然没有深入了 ...

  6. Currency Exchange POJ - 1860 spfa判断正环

    //spfa 判断正环 #include<iostream> #include<queue> #include<cstring> using namespace s ...

  7. 1.mysql卸载重新安装问题

    前言:在开发过程中,MySQL数据库是很频繁使用的数据库,但是有时候,数据库一单出错,或者其他原因,想要重装数据库,难免会遇到MySQL重装之后服务启不来,,下面我就跟大家讨论下如何干净的卸载MySQ ...

  8. codeforces刷题记录

    Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) C. Magic Grid 这种题直接构造 数n是2的n次方的倍数的时候可以这样划分数 ...

  9. js替换从excel复制的文本的换行

    var newStr=oldStr.replace(/\n/g,','); 该代码即可将文本中的换行替换为, oldStr为从excel复制过来的值  newStr为替换后的值

  10. AntDesign(React)学习-13 Warning XX should not be prefixed with namespace XXX

    有篇UMI入门简易教程可以看看:https://www.yuque.com/umijs/umi/hello 程序在点击操作时报了一个Warning: [sagaEffects.put] User/up ...