【CodeForces】【DP】14E Camels
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<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,当前趋势为上升/下降。
状态转移
先给出状态转移方程吧。
\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]=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相关推荐
- 【CodeForces 1253C --- Sweets Eating】DP
[CodeForces 1253C --- Sweets Eating]DP Description Tsumugi brought n delicious sweets to the Light M ...
- UVA10074 Take the Land【最大子段和+DP】
The poor man went to the King and said, "Lord, I cannot maintain my family. Please give me some ...
- Bailian2766 最大子矩阵【最大子段和+DP】
最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 ...
- 51Nod-1051 最大子矩阵和【最大子段和+DP】
1051 最大子矩阵和 基准时间限制:2秒 空间限制:131072KB 分值:40难度:4级算法题 一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 例如 ...
- P5405 [CTS2019]氪金手游 【数学概率+树形dp】
P5405 [CTS2019]氪金手游 [数学概率+树形dp] 先考虑外向树的情况: 这个的关键是要把求满足拓扑序的概率转化为求 每个点都比它的子树中的所有节点先取到的概率 .单个节点 xxx 的概率 ...
- 【CodeForces 332B --- Maximum Absurdity】递推
[CodeForces 332B --- Maximum Absurdity]递推 题目来源:点击进入[CodeForces 332B - Maximum Absurdity] Description ...
- 【CodeForces 1255D --- Feeding Chicken】
[CodeForces 1255D --- Feeding Chicken] Description Long is a huge fan of CFC (Codeforces Fried Chick ...
- 【CodeForces 1255B --- Fridge Lockers】
[CodeForces 1255B --- Fridge Lockers] Description Hanh lives in a shared apartment. There are n peop ...
- 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 ...
- 【CodeForces 1257C --- Dominated Subarray】
[CodeForces 1257C --- Dominated Subarray] Description Let's call an array t dominated by value v in ...
最新文章
- 校园职业社交Handshake获1005万美金A轮融资
- divmod数字处理函数
- JDBC事务和JTA事务的区别 --包含spring事务 声明式事务
- 动作基类 CCAction
- 快速转 TypeScript 指南
- ECCV 2020 谷歌论文盘点—Poster 篇
- Intellij idea 自动生成serialVersionUID
- ECMAScript 发展历史
- sv_labs学习笔记——sv_lab4(System Verilog)
- U890第二次开发的BOM表工具--自主知识产权
- php 数组 判断可以吗,php判断一个数组是否为有序
- ajax上传文件formData
- 【windows】修复win7便签
- 有道单词本导出xml转换.
- android 自定义searchview,android自定义searchView圆角
- 宝塔面板本地调试网站提示域名解析错误的问题
- Vue的计算属性computed和监听属性watch
- 手把手的教你安装PyCharm --Pycharm安装详细教程(一)(非常详细,非常....)
- 技术总监:求求你,别写这么多if...else..了
- 正则表达式切掉log日志前面不需要的内容