CodeForces 14 E.Camels(dp)

来源:互联网 发布:小说网源码加自动采集 编辑:程序博客网 时间:2024/05/20 20:23

Description

构造序列y1,...,n满足:

1.有tj(2jn1)满足yj1<yj>yj+1

2.有t1j(2jn1)满足yj1>yj<yj+1

3.yj是介于1~4之间的整数

4.yjyj+1,1jn1

问方案数

Input

两个整数nt (3n20,1t10)

Output

输出方案数

Sample Input

6 1

Sample Output

6

Solution

dp[i][j][k][a][b]填前i个值,j个波峰,k个波谷,yi1=a,yi=b的方案数,每次枚举当前位置的值,与前两个值比较看是否会多出一个波峰或波谷进行转移即可,时间复杂度O(64nt2)

Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;int n,t;ll dp[22][22][22][5][5];//dp[i][j][k][a][b]填前i个y,j个波峰,k个波谷,第i-1个y是a,第i个y是b int main(){    scanf("%d%d",&n,&t);    memset(dp,0,sizeof(dp));    for(int i=1;i<=4;i++)           for(int j=1;j<=4;j++)            if(j!=i)dp[2][0][0][i][j]=1;    for(int i=2;i<n;i++)        for(int j=0;j<=t;j++)            for(int k=0;k<=t-1;k++)                 for(int a=1;a<=4;a++)                    for(int b=1;b<=4;b++)                        if(a!=b)                            for(int c=1;c<=4;c++)                                if(b!=c)                                {                                    if(a>b&&b<c)dp[i+1][j][k+1][b][c]+=dp[i][j][k][a][b];                                    else if(a<b&&b>c)dp[i+1][j+1][k][b][c]+=dp[i][j][k][a][b];                                    else dp[i+1][j][k][b][c]+=dp[i][j][k][a][b];                                }    ll ans=0;    for(int i=1;i<=4;i++)        for(int j=1;j<=4;j++)            ans+=dp[n][t][t-1][i][j];    printf("%I64d\n",ans);    return 0;}
原创粉丝点击