题目链接:https://codeforces.com/contest/14/problem/E
d p [ p o s ] [ i ] [ j ] [ a ] [ b ] dp[pos][i][j][a][b] dp[pos][i][j][a][b]表示到第 p o s pos pos 位, 第 p o s pos pos 位为 i i i ,第 p o s − 1 pos-1 pos−1 位为 j j j ,有 a a a 个波峰, b b b 个波谷。
#include <iostream>
using namespace std;
long long dp[25][5][5][15][15];
int n,t;
int main()
{
scanf("%d%d",&n,&t);
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
if(i!=j) dp[2][i][j][0][0]=1;
for(int pos=2;pos<n;pos++)
for(int a=0;a<=t;a++)
for(int b=0;b<t;b++)
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
for(int k=1;k<=4;k++)
if(i<j && j>k) dp[pos+1][j][k][a+1][b]+=dp[pos][i][j][a][b];
else if(i>j && j<k) dp[pos+1][j][k][a][b+1]+=dp[pos][i][j][a][b];
else if(i!=j && j!=k) dp[pos+1][j][k][a][b]+=dp[pos][i][j][a][b];
long long ans=0;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
ans+=dp[n][i][j][t][t-1];
printf("%lld\n",ans);
return 0;
}