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. [CF662C Binary Table][状压+FWT]

    CF662C Binary Table 一道 FWT 的板子-比较难想就是了 有一个 \(n\) 行 \(m\) 列的表格,每个元素都是 \(0/1\),每次操作可以选择一行或一列,把 \(0/1\) ...

  2. Educational Codeforces Round 79 (Rated for Div. 2) Finished (A-D)

    如果最大值比剩余两个加起来的总和+1还大,就是NO,否则是YES #include<bits/stdc++.h> using namespace std; int main(){ int ...

  3. UVA750回溯法典例-八皇后

    文章代码选自UVA750-8 Queens Chess Problem的部分代码 vj题目链接:https://vjudge.net/problem/UVA-750 由于UVA中要求按照字典序输出,下 ...

  4. QS Network ZOJ - 1586 板子题

    #include<iostream> #include<algorithm> using namespace std; ; struct edge{ int a,b; doub ...

  5. Goland 2019下载和安装(带破解补丁和汉化包)

    Goland 简介 Goland 是由 JetBrains 公司开发的一个新的商业 IDE,旨在为 Go 开发者提供的一个符合人体工程学的新的商业 IDE.Goland 整合了 IntelliJ 平台 ...

  6. DFS-回溯与剪枝-C - N皇后问题

    C - N皇后问题 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出有多少种合法的放 ...

  7. Robot Framework选择定位option类型下拉框

    页面下拉框一般有两种类型,一种是div标签的,一种是option类型的,比如: div标签类型则可以通过定位进行元素点击去选择对应的枚举参数则可,而option类型的下拉选项则通过Selenium2L ...

  8. 八连通(vector动态数组法)

    题目和一般的八连通一样,但行数和列数未定,相乘对于1e6,直接开a[1e6][1e6]的数组肯定会爆内存.用二维的动态vector就能很好的解决这个问题 #include<bits/stdc++ ...

  9. 第70届(2019)IMO中国国家队选拔考试试题

    (几何除外)1,几何,略2,给定n≥3,是否存在无穷个2n元集{a1,...,an,b1,...,bn}满足其中元素整体互素,a1,...,an成等差数列,b1,...,bn也成等差数列.3,给定k, ...

  10. numpy学习(四)

    练习篇(Part 4) 41. How to sum a small array faster than np.sum? (★★☆) arr = np.arange(10) print(np.add. ...