CodeForces 14E Camels

题目

◇题目传送门◆

题目大意

给定N,TN,TN,T要求求出满足下列条件的填数方案数。
1. 对于第j(2≤j≤N−1)j(2≤j≤N−1)j(2\le j\le N-1)个数ajaja_j,有TTT个需要满足aj−1&lt;aj" role="presentation" style="position: relative;">aj−1<ajaj−1<aja_{j-1}且aj>aj+1aj>aj+1a_j>a_{j+1};
2. 对于第j(2≤j≤N−1)j(2≤j≤N−1)j(2\le j\le N-1)个数ajaja_j,有T−1T−1T-1个需要满足aj−1>ajaj−1>aja_{j-1}>a_j且aj<aj+1aj<aj+1a_j

3. 对于任意两个相邻的数ai,ajai,aja_i,a_j,需要满足ai≠ajai≠aja_i\ne a_j;
4. 所填数字只能是1,2,3,41,2,3,41,2,3,4。

思路

关于统计类问题的解法一般有DP,暴力DFS。

而从这道题的题意来看,暴力肯定是不行的,所以我们只能使用DP。

我们定义状态为f[i][j][k][0/1]f[i][j][k][0/1]f[i][j][k][0/1],表示现在已经填到了第iii个位置,已经有j" role="presentation" style="position: relative;">jjj个位置满足上述条件,且当前所填的数为kkk,当前趋势为上升/下降。

状态转移

先给出状态转移方程吧。

{f[i][j][k][0]=∑l=1k−1f[i−1][j][l][0]+f[i−1][j][l][1]f[i][j][k][1]{∑l=k+14f[i−1][j][l][1]∑l=k+14f[i−1][j−1][k][0]+f[i−1][j][l][1](j&gt;0)" role="presentation">⎧⎩⎨⎪⎪⎪⎪f[i][j][k][0]=∑k−1l=1f[i−1][j][l][0]+f[i−1][j][l][1]f[i][j][k][1]{∑4l=k+1f[i−1][j][l][1]∑4l=k+1f[i−1][j−1][k][0]+f[i−1][j][l][1](j>0){f[i][j][k][0]=∑l=1k−1f[i−1][j][l][0]+f[i−1][j][l][1]f[i][j][k][1]{∑l=k+14f[i−1][j][l][1]∑l=k+14f[i−1][j−1][k][0]+f[i−1][j][l][1](j>0)

\begin{cases}f[i][j][k][0]=\sum_{l=1}^{k-1}{f[i-1][j][l][0]+f[i-1][j][l][1]}\\f[i][j][k][1]\begin{cases}\sum_{l=k+1}^{4}f[i-1][j][l][1]\\\sum_{l=k+1}^{4}f[i-1][j-1][k][0]+f[i-1][j][l][1](j >0)\end{cases}\end{cases}

解释一下:

上升的第一种f[i−1][j][l][0]f[i−1][j][l][0]f[i-1][j][l][0],即两个都处于同一个上升段,故直接相加;

上升的第二种f[i−1][j][l][1]f[i−1][j][l][1]f[i-1][j][l][1],即上一个数是一个下降段的末尾,故也应直接相加;

下降的第一种f[i−1][j][l][1]f[i−1][j][l][1]f[i-1][j][l][1],即两个数都处于下降段,故直接相加;

下降的第二种f[i−1][j−1][l][0]f[i−1][j−1][l][0]f[i-1][j-1][l][0],即上一个点是一个上升段的末尾,故也应直接相加。

初始状态

这里还是先给出初始状态再解释。

f[2][0][4][0]=3f[2][0][3][0]=2f[2][0][2][0]=1f[2][0][4][0]=3f[2][0][3][0]=2f[2][0][2][0]=1

f[2][0][4][0]=3\\f[2][0][3][0]=2\\f[2][0][2][0]=1

第一个:当当前数字为4,处于上升段,则第一个数字有3种选择;

同理可推出第二、第三个初始状态。

正解代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int Maxn=20;
const int Maxt=10;int N,T;
int f[Maxn+5][Maxt+5][4][2];int main() {#ifdef LOACLfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifscanf("%d %d",&N,&T);f[2][0][4][0]=3;f[2][0][3][0]=2;f[2][0][2][0]=1;for(int i=3;i<=N;i++)for(int j=0;j<=T;j++)for(int k=1;k<=4;k++)for(int l=1;l<=4;l++) {if(l<k)f[i][j][k][0]+=f[i-1][j][l][0]+f[i-1][j][l][1];if(l>k)f[i][j][k][1]+=f[i-1][j][l][1]+(j>0?f[i-1][j-1][l][0]:0);}int ans=0;for(int i=1;i<=4;i++)ans+=f[N][T][i][1];printf("%d\n",ans);return 0;
}

【CodeForces】【DP】14E Camels相关推荐

  1. 【CodeForces 1253C --- Sweets Eating】DP

    [CodeForces 1253C --- Sweets Eating]DP Description Tsumugi brought n delicious sweets to the Light M ...

  2. UVA10074 Take the Land【最大子段和+DP】

    The poor man went to the King and said, "Lord, I cannot maintain my family. Please give me some ...

  3. Bailian2766 最大子矩阵【最大子段和+DP】

    最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 ...

  4. 51Nod-1051 最大子矩阵和【最大子段和+DP】

    1051 最大子矩阵和 基准时间限制:2秒 空间限制:131072KB 分值:40难度:4级算法题 一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 例如 ...

  5. P5405 [CTS2019]氪金手游 【数学概率+树形dp】

    P5405 [CTS2019]氪金手游 [数学概率+树形dp] 先考虑外向树的情况: 这个的关键是要把求满足拓扑序的概率转化为求 每个点都比它的子树中的所有节点先取到的概率 .单个节点 xxx 的概率 ...

  6. 【CodeForces 332B --- Maximum Absurdity】递推

    [CodeForces 332B --- Maximum Absurdity]递推 题目来源:点击进入[CodeForces 332B - Maximum Absurdity] Description ...

  7. 【CodeForces 1255D --- Feeding Chicken】

    [CodeForces 1255D --- Feeding Chicken] Description Long is a huge fan of CFC (Codeforces Fried Chick ...

  8. 【CodeForces 1255B --- Fridge Lockers】

    [CodeForces 1255B --- Fridge Lockers] Description Hanh lives in a shared apartment. There are n peop ...

  9. HDU-5542-The Battle of Chibi【树状数组+dp】

    HDU-5542-The Battle of Chibi[树状数组+dp] Time Limit: 6000/4000 MS (Java/Others) Memory Limit: 65535/655 ...

  10. 【CodeForces 1257C --- Dominated Subarray】

    [CodeForces 1257C --- Dominated Subarray] Description Let's call an array t dominated by value v in ...

最新文章

  1. 校园职业社交Handshake获1005万美金A轮融资
  2. divmod数字处理函数
  3. JDBC事务和JTA事务的区别 --包含spring事务 声明式事务
  4. 动作基类 CCAction
  5. 快速转 TypeScript 指南
  6. ECCV 2020 谷歌论文盘点—Poster 篇
  7. Intellij idea 自动生成serialVersionUID
  8. ECMAScript 发展历史
  9. sv_labs学习笔记——sv_lab4(System Verilog)
  10. U890第二次开发的BOM表工具--自主知识产权
  11. php 数组 判断可以吗,php判断一个数组是否为有序
  12. ajax上传文件formData
  13. 【windows】修复win7便签
  14. 有道单词本导出xml转换.
  15. android 自定义searchview,android自定义searchView圆角
  16. 宝塔面板本地调试网站提示域名解析错误的问题
  17. Vue的计算属性computed和监听属性watch
  18. 手把手的教你安装PyCharm --Pycharm安装详细教程(一)(非常详细,非常....)
  19. 技术总监:求求你,别写这么多if...else..了
  20. 正则表达式切掉log日志前面不需要的内容

热门文章

  1. GEA 1.7 工具及资产管道
  2. 好看实用的便签条工具推荐
  3. 西安交通大学915考研编程笔记
  4. Dalvik虚拟机垃圾收集(GC)过程分析
  5. Python——LeetCode刷题——【387. 字符串中的第一个唯一字符】
  6. 021淘宝轮播图制作
  7. 在Linux打包成jar
  8. 【java】eclipse
  9. Linux内核源码介绍
  10. python中append的用法是什么?