[CF] E. Camels
Posted baseai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CF] E. Camels相关的知识,希望对你有一定的参考价值。
CF 2000 的dp题目还是有点难qwq
题意:
一行有(n)个空位,每个空位可以填([1,4])的整数,要求:
1.有(t)个位置满足 (ai?1<ai>ai+1(1<i<n))
2.有(t?1)个位置满足 (ai?1>ai<ai+1)
的方案总数
题解:
设 (f[i][j][k][0/1]) 表示 (i)位置 当前数是 (j) 已经有 (k) 个满足条件一的位置 上升/下降趋势
转移:
[f[i][j][k][0]=sum f[i-1][l][k][0] + f[i-1][l][k][1] (1<=l<j)]
[f[i][j][k][1]=sum f[i-1][l][k][1] + f[i-1][l][k-1][0] (j<l<=n)]
当 (k = 0)时说明还没有顶峰,第二个转移的后面这种情况就是0
Code
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
inline int read() {
int x=0,f=1; char ch=getchar();
while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') { x=(x<<3)+(x<<1)+(ch^48); ch=getchar(); }
return x * f;
}
const int N = 27;
int n,t;
int f[N][N][N][2]; //f[i][j][k][0/1] 表示 i 位置,j高度,k个峰顶,上升/下降
int main()
{
n = read(), t = read();
f[2][4][0][0] = 3;
f[2][3][0][0] = 2;
f[2][2][0][0] = 1;
for(int i=3;i<=n;++i)
for(int k=0;k<=t;++k)
for(int j=1;j<=4;++j)
for(int l=1;l<=4;++l) {
if(l < j) f[i][j][k][0] += f[i-1][l][k][0] + f[i-1][l][k][1]; //增加了一个低谷,不改变k
if(l > j) f[i][j][k][1] += f[i-1][l][k][1] + (k>0 ? f[i-1][l][k-1][0] : 0);
// printf("i = %d %d
",i,f[i][j][k][1]);
}
int ans = 0;
for(int i=1;i<=4;++i)
ans += f[n][i][t][1];
printf("%d",ans);
return 0;
}
以上是关于[CF] E. Camels的主要内容,如果未能解决你的问题,请参考以下文章
CF 1114 E. Arithmetic Progression