14E:Camels
题意简述
一行有
n
个空位,每个空位可以填
1.有
t
个位置满足
2.有
t−1
个位置满足
ai−1>ai<ai+1
数据范围
1≤n≤20
1≤t≤10
思路
DP。
f[i][j][k][0/1]
表示当前填到了第
i
位,
转移的话,枚举一下上一个填的数是多少。
复杂度
代码
#include<cstdio>
using namespace std;
int f[21][11][5][2];
int ans,n,m;
int main()
{
scanf("%d%d",&n,&m);
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<=m;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);
}
for (int i=1;i<=4;i++)
ans+=f[n][m][i][1];
printf("%d",ans);
return 0;
}