比较传统的DP题目
E. Camels
#include <cstring>
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
int dp[25][2][5][12][12]; // 第几位,0前大1前小,当位数字,大的数量,小的数量
int main()
{
int i, j, k, r1, r2, n, t;
scanf("%d%d",&n,&t);
memset(dp,0,sizeof(dp));
for(i=1; i<=4; i++)
dp[1][0][i][0][0]=1;//因为之前没有数字,默认状态0
for(i=2; i<=n; i++)
{
if(i==2)
{
for(j=1; j<=4; j++)
for(k=1; k<=4; k++)
{
if(j==k) continue;
if(j<k)
dp[i][1][k][0][0]+=dp[i-1][0][j][0][0];
else
dp[i][0][k][0][0]+=dp[i-1][0][j][0][0];
}
}
else
{
for(j=1; j<=4; j++)
for(k=1; k<=4; k++)
for(r1=0; r1<=t; r1++)
for(r2=0; r2<=t-1; r2++)
{
if(j==k) continue;
if(j<k)
{
dp[i][1][k][r1][r2+1]+=dp[i-1][0][j][r1][r2];
dp[i][1][k][r1][r2]+=dp[i-1][1][j][r1][r2];
}
else
{
dp[i][0][k][r1+1][r2]+=dp[i-1][1][j][r1][r2];
dp[i][0][k][r1][r2]+=dp[i-1][0][j][r1][r2];
}
}
}
}
int ans=0;
for(i=1;i<=4;i++)
ans+=dp[n][1][i][t][t-1]+dp[n][0][i][t][t-1];
printf("%d\n",ans);
return 0;
}