终于在没有看题解的情况下自己写出了dp题,虽然这题比较水,但还是迈出了第一步。
题意大致是在一个平面坐标系,给定一系列x为1,2,3....n的点,y为1到4之间的值,求其中峰的个数为l的有几种,要求相邻两点y不能相等,有l个峰必须有l-1个谷。
鄙人方法比较笨,直接开了四维数组dp[i][j][flag][L],表示第i位为j的时候有L个峰,此时末尾为降序的话flag=1,不然等0。
状态转移不难想
#include<stdio.h>
int main()
{
int dp[21][5][2][11]= {0};
dp[2][2][0][0]=1;
dp[2][3][0][0]=2;
dp[2][4][0][0]=3;
for(int i=3; i<21; i++)
{
for(int j=1; j<=4; j++)
{
for(int k=1; k<j; k++)
{
for(int o=0; o<=10;o++)
{
dp[i][j][0][o]+=dp[i-1][k][1][o];
dp[i][j][0][o]+=dp[i-1][k][0][o];
}
}
for(int k=4; k>j; k--)
{
for(int o=0; o<=10; o++)
{
dp[i][j][1][o+1]+=dp[i-1][k][0][o];
dp[i][j][1][o]+=dp[i-1][k][1][o];
}
}
}
//printf("%d\n",dp[3][1][1][1]);
}
int n,t;
while (scanf("%d%d",&n,&t)!=EOF)
{
int ans=0;
//printf("%d\n",dp[3][1][1][1]);
for(int i=1; i<=4; i++)
{
ans+=dp[n][i][1][t];
}
printf("%d\n",ans);
}
}