codeforces 14E Camels (计数类dp)

来源:互联网 发布:样加入淘宝客去推广 编辑:程序博客网 时间:2024/05/20 20:02

题意:

给出n,t,分别表示有n个数,t个波峰,t-1波谷。要求出满足n个数组成类似于波一样的结构,并且波峰t个,波谷t-1个,的种类数。

题解:
要什么状态就加什么状态呗,我们要确定递推关系,坑定要知道前一个状态是波分还是波谷,才能增加数字使这个状态称为波分或者波谷。要去定上个数是波分还是波谷,只要知道前两个数选的是什么,然后枚举这个数这样就可以构造波峰和波谷。dp[i][j][k][x][y] 表示第i个点为止,波峰有j个,波谷有k个,前一个数选x,这个数选y,所能得到的种类数。

#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<map>using namespace std;typedef long long lld;const int oo=0x3f3f3f3f;const lld OO=1LL<<61;const int MOD=2520;#define eps 1e-6const int maxn=105;lld dp[22][12][12][4][4];void DP(){    memset(dp,0,sizeof dp);    for(int x=0;x<4;x++)        for(int y=0;y<4;y++)            if(x!=y)                dp[2][0][0][x][y]=1;    for(int i=2;i<=20;i++)    {        for(int j=0;j<=10;j++)        {            for(int k=0;k<=10;k++)            {                for(int x=0;x<4;x++)                {                    for(int y=0;y<4;y++)                    {                        if(dp[i][j][k][x][y]==0)continue;                        for(int z=0;z<4;z++)                        {                            if(y>x)                            {                                ///z==y时没判断                                if(z>y)                                    dp[i+1][j][k][y][z]+=dp[i][j][k][x][y];                                if(z<y)                                    dp[i+1][j+1][k][y][z]+=dp[i][j][k][x][y];                            }                            if(y<x)                            {                                ///z==y时没判断                                if(z>y)                                    dp[i+1][j][k+1][y][z]+=dp[i][j][k][x][y];                                if(z<y)                                    dp[i+1][j][k][y][z]+=dp[i][j][k][x][y];                            }                        }                    }                }            }        }    }}int main(){    int n,t;    DP();    scanf("%d %d",&n,&t);    lld ans=0;    for(int x=0;x<4;x++)        for(int y=0;y<4;y++)            ans+=dp[n][t][t-1][x][y];    cout<<ans<<endl;    return 0;}/***/




0 0
原创粉丝点击